python - Pandas 创建复制另一个单元格值的列

标签 python pandas dataframe

我有一个 Receipt Journal DataFrame,其中包含大约 400,000 行以下内容: Snippet1

包含“支付”列(例如,现金、CrCd)值的行是收据总额。后面的行是该事务中的项目。我实际上想将这些项目中的每一项与新列中收据总计行中的数字相匹配,从而产生以下结果: Snippet2

通过将单元格 O2 设置为 =IF(N2="",O1,C2) 并拖动,我能够在 Excel 中实现这一点。理想情况下,我想避免使用 Excel 来操作数据。

有没有办法在不使用 iterrows()itertuples() 的情况下在 Pandas 中执行此操作?这两个都需要指数时间才能完成。

更新: 这是用于测试的数据框的逗号分隔文本:

Company Name,Str,Rcpt#,Rcpt Date,Time,Ext O P$,Disc %,Ext D$,Ext P$,Rcpt T$,Shipping w/T,Fee $ w/T,Rcpt Total,Tender
,2,32381,4/5/2015,5:51p,1.96,0,0,1.96,0.04,0,0,2,Cash
,2683,18924,VC,,Item_Desc,1,1.5,0,0.25,,,,
,2713,505101,VC1,C12A,Item_desc,1,0.46,0,0.12,,,,
,,32382,4/5/2015,6:01p,18.3,0,0,18.3,1.7,0,0,20,CrCd
,3034,502201,AC,,Item_desc,1,9.15,0,3.36,,,,
,3034,502201,AC5,,Item_desc,1,9.15,0,3.36,,,,
,,32383,4/5/2015,6:08p,9.15,0,0,9.15,0.85,0,0,10,Cash
,3034,502201,AC5,,Item_Desc,1,9.15,0,3.36,,,,
,,32384,4/5/2015,6:13p,18.3,0,0,18.3,1.7,0,0,20,CrCd
,2212,505201,GV,J25A,Item_desc,1,9.15,0,1.56,,,,
,2212,505201,GV,J25A,Item_desc,1,9.15,0,1.56,,,,
,,32385,4/5/2015,6:15p,4.5,0,0,4.5,0,0,0,4.5,Cash
,4619,18924,VC,,Item_desc,1,4.5,0,0.5,,,,
,,32386,4/5/2015,6:15p,4.5,0,0,4.5,0,0,0,4.5,Cash
,4619,18924,VC,,Item_desc,1,4.5,0,0.5,,,,

最佳答案

更新:

In [11]: df['ReceiptNumber'] = (df.assign(ReceiptNumber=np.where(pd.notnull(df.Tender),
   ....:                                                         df['Rcpt#'],
   ....:                                                         np.nan))['ReceiptNumber']
   ....:                          .fillna(method='pad')
   ....:                          .astype(int))

In [12]: df[['Rcpt#','Tender','ReceiptNumber']]
Out[12]:
     Rcpt# Tender  ReceiptNumber
0    32381   Cash          32381
1    18924    NaN          32381
2   505101    NaN          32381
3    32382   CrCd          32382
4   502201    NaN          32382
5   502201    NaN          32382
6    32383   Cash          32383
7   502201    NaN          32383
8    32384   CrCd          32384
9   505201    NaN          32384
10  505201    NaN          32384
11   32385   Cash          32385
12   18924    NaN          32385
13   32386   Cash          32386
14   18924    NaN          32386

旧答案:

df.assign(ReceiptNumber=np.where(pd.notnull(df.Tender),
                                 df['Rcpt#'],
                                 np.nan))['ReceiptNumber']
  .fillna(method='pad')

PS 这个片段没有经过测试,因为你没有以文本形式提供你的数据集,所以我无法复制和粘贴它

关于python - Pandas 创建复制另一个单元格值的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38316290/

相关文章:

python - 在 python 中遍历字典中的列表

Python Pandas - df.loc - 添加附加条件不起作用

r - 动态重命名数据框

python - 如何在多个列表中查找相同的项目?

python - 无法识别凝聚聚类的新 distance_threshold 参数

Python 以一种棘手的方式连接列表元素

python - Pandas 根据另一列中的条件进行填充

python - 获取 Pandas DataFrame 可读数据类型

arrays - pyspark : How we select the dataframe which takes the highest values ​by Matricule?

从数据框中删除同时满足两个条件的列