为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2023-02-15 15:59:37
我有这样的数据集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在 pic 格式中,它如下所示:我想要的是,对于存在 number 和 shipment_date 的行,我们检查“Express”所在的服务。然后对于这样的行,我想将 desc col 中的“燃油附加费”行拉到与数字相同的行以及shipment_date相应的金额值。所以像下面这样: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 FUEL SURCHARGE  3.28            DUTIES TAXES PAID   25                1826995520  2/12/19 DUTIES & TAXES                  IMPORT EXPORT TAXES 600.47            IMPORT EXPORT DUTIES    561.012998455062  4/5/20  Express FUEL SURCHARGE  0.72看起来像下面的图片格式。最后我只关心服务是“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']=sdf.loc[df.shipment_date.isnull(),'amount']=''
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

空行填写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    amount

8   5.733894e+09    29/04/2020  Express DUTIES TAXES PAID   25.00

9   5.733894e+09    29/04/2020  Express FUEL SURCHARGE  3.28

10  5.733894e+09    29/04/2020  Express NaN NaN

14  2.998455e+09    4/5/20  Express FUEL SURCHARGE  0.72

15  2.998455e+09    4/5/20  Express NaN NaN


查看完整回答
反对 回复 2023-02-15
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

从逻辑上讲,您有一个经典的主/详细数据集。您的详细数据集没有主记录的外键。添加 FK,然后您可以对 master 进行过滤条件,对 detail 进行过滤条件并将 FK 加入 PK

  1. 已经修改了源数据,使得从中构建 DF 变得简单

  2. 填充详细记录的 FKfillna

  3. 选择主记录和明细记录并将它们加入 PK/FK

import numpy as np

data = '''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'''

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.NaN

dfall = 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])


查看完整回答
反对 回复 2023-02-15
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以向前填充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         


查看完整回答
反对 回复 2023-02-15
  • 3 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信