Python 如何基于另一列向dataframe追加数据?
我想通过检查一个数据帧中的值是否包含相同的文档编号,将它们附加到另一个数据帧中 ip_df:Python 如何基于另一列向dataframe追加数据?,python,pandas,Python,Pandas,我想通过检查一个数据帧中的值是否包含相同的文档编号,将它们附加到另一个数据帧中 ip_df: CardName DocNum DocDate DocTotal DocNum2 PaidToDate Balance 0 CompanyA 800100001 2021-03-01 10000.000000 920000000 10000.000000 0.000000 1 CompanyA 800100002
CardName DocNum DocDate DocTotal DocNum2 PaidToDate Balance
0 CompanyA 800100001 2021-03-01 10000.000000 920000000 10000.000000 0.000000
1 CompanyA 800100002 2021-03-01 20000.000000 920000000 20000.000000 0.000000
2 CompanyA 800100003 2021-03-01 30000.000000 920000000 30000.000000 0.000000
3 CompanyA 800100004 2021-03-01 40000.000000 920000000 40000.000000 0.000000
4 CompanyA 800100005 2021-03-01 50000.000000 920000000 50000.000000 0.000000
.. ... ... ... ... ... ... ...
94 CompanyY 800100006 2021-03-01 60000.000000 920000005 60000.000000 0.000000
95 CompanyY 800100007 2021-03-01 70000.000000 920000005 70000.000000 0.000000
96 CompanyY 800100008 2021-03-01 80000.000000 920000005 80000.000000 0.000000
97 CompanyZ 800100009 2021-03-01 90000.000000 920000006 90000.000000 0.000000
98 CompanyZ 800100010 2021-03-01 11000.000000 920000006 11000.000000 0.000000
[99 rows x 7 columns]
ar_df:
BPCode Balance Currency DueDate BPName TransId Ref1 Payment Received Bank Charge
0 XXXXXXXX 10000.000000 USD 2020-09-29 CompanyA 503378 800100001 0 0
1 XXXXXXXX 20000.000000 USD 2021-03-01 CompanyA 543103 800100002 0 0
2 XXXXXXXX 30000.000000 USD 2021-03-01 CompanyA 543171 800100003 0 0
3 XXXXXXXX 40000.000000 USD 2021-03-01 CompanyA 544205 800100004 0 0
4 XXXXXXXX 50000.000000 USD 2021-03-01 CompanyA 544222 800100005 0 0
... ... ... ... ... ... ... ... ... ...
3763 XXXXXXXX 60000.000000 USD 2021-03-02 CompanyY 548612 800100006 0 0
3764 XXXXXXXX 70000.000000 USD 2021-03-02 CompanyY 547727 800100007 0 0
3765 XXXXXXXX 80000.000000 USD 2021-03-30 CompanyY 553819 800100008 0 0
3766 XXXXXXXX 90000.000000 USD 2021-04-01 CompanyZ 547707 800100009 0 0
3767 XXXXXXXX 11000.000000 USD 2021-04-29 CompanyZ 556102 800100010 0 0
[3768 rows x 9 columns]
我正在尝试这样做:
for row in ip_df:
if ip_df.row['DocNum'] == ar_df.row['Ref1']:
ap_df.row['Payment Received'] = ip_df.row['PaidToDate']
但我不太确定这样做的正确方法
我尝试过四处搜索,但大多数情况下,答案似乎总是指向只检查标量值
我想要实现的是检查ip_df中的行中是否存在“DocNum”,是否可以在ap_df的“Ref1”列中找到“DocNum”,如果为true,则将ap_df的“PaidToDate”行设置为ip_df的“PaidToDate”行中的值
最终结果应该如下所示:
BPCode Balance Currency DueDate BPName TransId Ref1 Payment Received Bank Charge
0 XXXXXXXX 10000.000000 USD 2020-09-29 CompanyA 503378 800100001 10000.000000 0
1 XXXXXXXX 20000.000000 USD 2021-03-01 CompanyA 543103 800100002 20000.000000 0
2 XXXXXXXX 30000.000000 USD 2021-03-01 CompanyA 543171 800100003 30000.000000 0
3 XXXXXXXX 40000.000000 USD 2021-03-01 CompanyA 544205 800100004 40000.000000 0
4 XXXXXXXX 50000.000000 USD 2021-03-01 CompanyA 544222 800100005 50000.000000 0
... ... ... ... ... ... ... ... ... ...
3763 XXXXXXXX 60000.000000 USD 2021-03-02 CompanyY 548612 800114258 60000.000000 0
3764 XXXXXXXX 70000.000000 USD 2021-03-02 CompanyY 547727 800113975 70000.000000 0
3765 XXXXXXXX 80000.000000 USD 2021-03-30 CompanyY 553819 800115292 80000.000000 0
3766 XXXXXXXX 90000.000000 USD 2021-04-01 CompanyZ 547707 800113957 90000.000000 0
3767 XXXXXXXX 11000.000000 USD 2021-04-29 CompanyZ 556102 800115741 11000.000000 0
[3768 rows x 9 columns]
感谢您提前提供的任何帮助 使用
df.merge
对具有df.rename
的列子集进行合并:
In [220]: ar_df['Ref1'] = ar_df['Ref1'].str.replace('', np.nan).astype(int)
In [221]: ip_df['DocNum'] = ar_df['DocNum'].str.replace('', np.nan).astype(int)
In [222]: ar_df.merge(ip_df[['DocNum', 'PaidToDate']], left_on='Ref1', right_on='DocNum').drop(['Payment Received', 'DocNum'], 1).rename(columns={'PaidToDate':'Payment Received'})
Out[222]:
BPCode Balance Currency DueDate BPName TransId Ref1 Bank_Charge Payment_Received
0 XXXXXXXX 10000.0 USD 2020-09-29 CompanyA 503378 800100001 0 10000.0
1 XXXXXXXX 20000.0 USD 2021-03-01 CompanyA 543103 800100002 0 20000.0
2 XXXXXXXX 30000.0 USD 2021-03-01 CompanyA 543171 800100003 0 30000.0
3 XXXXXXXX 40000.0 USD 2021-03-01 CompanyA 544205 800100004 0 40000.0
4 XXXXXXXX 50000.0 USD 2021-03-01 CompanyA 544222 800100005 0 50000.0
对带有
df.rename
的列子集使用df.merge
:
In [220]: ar_df['Ref1'] = ar_df['Ref1'].str.replace('', np.nan).astype(int)
In [221]: ip_df['DocNum'] = ar_df['DocNum'].str.replace('', np.nan).astype(int)
In [222]: ar_df.merge(ip_df[['DocNum', 'PaidToDate']], left_on='Ref1', right_on='DocNum').drop(['Payment Received', 'DocNum'], 1).rename(columns={'PaidToDate':'Payment Received'})
Out[222]:
BPCode Balance Currency DueDate BPName TransId Ref1 Bank_Charge Payment_Received
0 XXXXXXXX 10000.0 USD 2020-09-29 CompanyA 503378 800100001 0 10000.0
1 XXXXXXXX 20000.0 USD 2021-03-01 CompanyA 543103 800100002 0 20000.0
2 XXXXXXXX 30000.0 USD 2021-03-01 CompanyA 543171 800100003 0 30000.0
3 XXXXXXXX 40000.0 USD 2021-03-01 CompanyA 544205 800100004 0 40000.0
4 XXXXXXXX 50000.0 USD 2021-03-01 CompanyA 544222 800100005 0 50000.0
pd.merge
?这回答了你的问题吗?谢谢你给我指出这个资源!这无疑帮助我理解了合并操作。请稍等,因为我试图实现本资源中给出的想法!虽然这不是我问题的答案,但在处理其他合并操作时,它回答了我头脑中的更多问题。非常感谢您提供这一令人敬畏的资源<代码>pd.合并?这回答了你的问题吗?谢谢你给我指出这个资源!这无疑帮助我理解了合并操作。请稍等,因为我试图实现本资源中给出的想法!虽然这不是我问题的答案,但在处理其他合并操作时,它回答了我头脑中的更多问题。非常感谢您提供这一令人敬畏的资源!你好这看起来很棒!我有点明白你想做什么。然而,我得到了一个ValueError:“您正在尝试合并object和int64列。如果您希望继续,您应该使用pd.concat”。错误似乎正在标记出merge语句。有什么办法可以绕过这个问题吗?将对象强制转换为整数有帮助吗?有。您可以使用astype
将这两个值强制转换为整数。我成功地做到了这一点,解决了我的问题。另外需要注意的是,我的列有空字符串:“”,这导致出现另一个错误:ValueError:invalid literal for int(),以10为基数:“”。Mayank,如果你能编辑你的帖子来处理这两个错误,我很乐意接受你的回复@Beelz我已经编辑了我的答案。请检查一下,马上,梅扬克!非常感谢。你好这看起来很棒!我有点明白你想做什么。然而,我得到了一个ValueError:“您正在尝试合并object和int64列。如果您希望继续,您应该使用pd.concat”。错误似乎正在标记出merge语句。有什么办法可以绕过这个问题吗?将对象强制转换为整数有帮助吗?有。您可以使用astype
将这两个值强制转换为整数。我成功地做到了这一点,解决了我的问题。另外需要注意的是,我的列有空字符串:“”,这导致出现另一个错误:ValueError:invalid literal for int(),以10为基数:“”。Mayank,如果你能编辑你的帖子来处理这两个错误,我很乐意接受你的回复@Beelz我已经编辑了我的答案。请检查一下,马上,梅扬克!非常感谢。