根据其他 col 值填充和移动 col 的值

我有这样的数据集


number  Shipment Date   service desc    amount

182692345   2/12/19 DUTIES & TAXES      

            IMPORT EXPORT DUTIES    561.01

            IMPORT EXPORT TAXES 600.47

1827975839  2/12/19 DUTIES & TAXES      

            IMPORT EXPORT DUTIES    160.19

3229475633  2/12/19 DUTIES & TAXES      

            IMPORT EXPORT TAXES 600.47

            IMPORT EXPORT DUTIES    561.01

5733894261  29/04/2020  Express     

            DUTIES TAXES PAID   25

            FUEL SURCHARGE  3.28

1826995520  2/12/19 DUTIES & TAXES      

            IMPORT EXPORT TAXES 600.47

            IMPORT EXPORT DUTIES    561.01

2998455062  4/5/20  Express     

            FUEL SURCHARGE  0.72

在 pic 格式中,它如下所示:

http://img3.mukewang.com/63ec911e0001fcef05270271.jpg

我想要的是,对于存在 number 和 shipment_date 的行,我们检查“Express”所在的服务。然后对于这样的行,我想将 desc col 中的“燃油附加费”行拉到与数字相同的行以及shipment_date相应的金额值。


所以像下面这样:


number  Shipment Date   service desc    amount

182692345   2/12/19 DUTIES & TAXES      

            IMPORT EXPORT DUTIES    561.01

            IMPORT EXPORT TAXES 600.47

1827975839  2/12/19 DUTIES & TAXES      

            IMPORT EXPORT DUTIES    160.19

3229475633  2/12/19 DUTIES & TAXES      

            IMPORT EXPORT TAXES 600.47

            IMPORT EXPORT DUTIES    561.01

5733894261  29/04/2020  Express FUEL SURCHARGE  3.28

            DUTIES TAXES PAID   25

                

1826995520  2/12/19 DUTIES & TAXES      

            IMPORT EXPORT TAXES 600.47

            IMPORT EXPORT DUTIES    561.01

2998455062  4/5/20  Express FUEL SURCHARGE  0.72

看起来像下面的图片格式。

http://img4.mukewang.com/63ec913300011c1105090255.jpg

最后我只关心服务是“Express”的行,所以如果我们去掉所有服务不是 express 的行并获得上面的格式(仅适用于 Express 值),那将是理想的。


我认为 pandasffill()和 transform 将是主要工具。所以我正在尝试以下内容:


df1=df.copy()


df1[['number', 'shipment_date']]=df1[['number', 'shipment_date']].ffill()

df1.desc=df1.desc.fillna('')

df1.amount= df1.amount.fillna('')


s= df1.groupby(['number', 'shipment_date']).amount.transform(lambda x: ' '.join(str(x)))


df.loc[df.shipment_date.notnull(),'amount']=s

df.loc[df.shipment_date.isnull(),'amount']=''


ABOUTYOU
浏览 125回答 3
3回答

慕婉清6462132

空行填写fillna(method='ffill'),由服务提取,由 获取shift(-1)。这是否符合问题的意图?df['service'] = df['service'].fillna(method='ffill')df = df[df['service'] == 'Express']df[['number','Shipment Date']] = df[['number','Shipment Date']].fillna(method='ffill')df[['desc','amount']] = df[['desc','amount']].shift(-1)df    number  Shipment Date   service desc    amount8   5.733894e+09    29/04/2020  Express DUTIES TAXES PAID   25.009   5.733894e+09    29/04/2020  Express FUEL SURCHARGE  3.2810  5.733894e+09    29/04/2020  Express NaN NaN14  2.998455e+09    4/5/20  Express FUEL SURCHARGE  0.7215  2.998455e+09    4/5/20  Express NaN NaN

慕码人8056858

从逻辑上讲,您有一个经典的主/详细数据集。您的详细数据集没有主记录的外键。添加 FK,然后您可以对 master 进行过滤条件,对 detail 进行过滤条件并将 FK 加入 PK已经修改了源数据,使得从中构建 DF 变得简单填充详细记录的 FKfillna选择主记录和明细记录并将它们加入 PK/FKimport numpy as npdata = '''number  Shipment Date   service  desc    amount182692345   2/12/19  DUTIES & TAXES                  -  -  IMPORT EXPORT DUTIES    561.01            -  -  IMPORT EXPORT TAXES  600.471827975839  2/12/19  DUTIES & TAXES                  -  -  IMPORT EXPORT DUTIES    160.193229475633  2/12/19  DUTIES & TAXES                  -  -  IMPORT EXPORT TAXES 600.47            -  -  IMPORT EXPORT DUTIES    561.015733894261  29/04/2020  Express                 -  -  DUTIES TAXES PAID   25            -  -  FUEL SURCHARGE  3.281826995520  2/12/19  DUTIES & TAXES                  -  -  IMPORT EXPORT TAXES  600.47            -  -  IMPORT EXPORT DUTIES    561.012998455062  4/5/20  Express                 -  -  FUEL SURCHARGE  0.72'''da = [[i for i in re.split("[ ][ ]+", l)] for l in data.split("\n")]dfall = pd.DataFrame(da[1:], columns=da[0])dfall["number"][dfall["number"]==""] = np.NaNdfall = dfall.fillna(method="ffill")pd.concat([dfall[dfall["desc"]=="FUEL SURCHARGE"], dfmaster[dfall["service"]=="Express"] ],           join="inner", keys="number"         ).sort_values(by=["number","service"], ascending=[True,False])

慕娘9325324

您可以向前填充service列中的缺失值,然后比较列表中的Express和最后shift匹配的行和列 by DataFrame.shiftand DataFrame.loc:mask = df['service'].ffill().eq('Express')df.loc[mask, ['desc','amount']] = df.loc[mask, ['desc','amount']].shift(-1)print (df)           number Shipment Date         service                        desc  \0    182692345       2/12/19  DUTIES & TAXES                               1                        NaN             NaN        IMPORT EXPORT DUTIES   2                        NaN             NaN         IMPORT EXPORT TAXES   3   1827975839       2/12/19  DUTIES & TAXES                               4                        NaN             NaN        IMPORT EXPORT DUTIES   5   3229475633       2/12/19  DUTIES & TAXES                               6                        NaN             NaN  IMPORT EXPORT TAXES 600.47   7                        NaN             NaN        IMPORT EXPORT DUTIES   8   5733894261    29/04/2020         Express           DUTIES TAXES PAID   9                        NaN             NaN              FUEL SURCHARGE   10                       NaN             NaN                               11  1826995520       2/12/19  DUTIES & TAXES                               12                       NaN             NaN         IMPORT EXPORT TAXES   13                       NaN             NaN        IMPORT EXPORT DUTIES   14  2998455062        4/5/20         Express              FUEL SURCHARGE   15                       NaN             NaN                         NaN       amount  0     None  1   561.01  2   600.47  3     None  4   160.19  5     None  6     None  7   561.01  8       25  9     3.28  10    None  11    None  12  600.47  13  561.01  14    0.72  15     NaN         
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python