Pandas:使用额外的列更新主 Dataframe ,在后续合并中增加公共列的数量

nfeuvbwi  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(122)

我试图弄清楚如何实现以下内容。假设我有一个主 Dataframe ,其中包含ID列和各种其他数据:

ID     A       B       C 
01     1x      1y      1z 
02     2x      2y      2z 
03     3x      3y      3z 
04     4x      4y      4z 
... 
01000  01000x  01000y  01000z

此外,我还在单独的、非常宽的 Dataframe 中为每个ID提供了额外的单行数据:

ID   New1    New2    New3    ...  New50 
01   01val1  01val2  01val3  ...  01val50

我的目标是创建一个非常稀疏的矩阵,在合并它们的公共ID值后,将所有这些列添加到主 Dataframe 。

复杂因素为:每个不同ID的附加 Dataframe 将与其他ID的 Dataframe 具有多个重叠的列名,并且我希望在这种情况下将数据保持在同一列中。

所需的示例输出如下所示:

ID     A       B       C       New1     New2     New3      ...  New50    ...  New200
01     1x      1y      1z      01val1   01val2   01val3    ...  01val50  ...  n/a
02     2x      2y      2z      n/a      n/a      02val3    ...  n/a      ...  02val200
03     3x      3y      3z      03val1   n/a      n/a       ...  03val50  ...  n/a
04     4x      4y      4z      n/a      04val2   n/a       ...  n/a      ...  n/a
...
01000  01000x  01000y  01000z  n/a      n/a      01000val3 ...  n/a      ...  01000val200

因此,如果我将ID 01的dataframe与master合并,并最终添加20个新列,然后将ID 02的dataframe与master合并,其中10个列具有相同的名称,则ID 02的公共列的值被简单地插入,而不是显示例如New1_x和New1_y。
我尝试了两种策略。通过反复合并:
master.merge(new_data, on='ID', how='left')
作为for循环的一部分,所有新的 Dataframe 列都被添加为New1_x和New1_y,我不能简单地删除所有 *y列,因为实际值是分开的,因此ID 01将在New1_x中具有其New1值,而ID 02将在New1_y中具有其New1值。
通过在每次合并之前标识所有公共列并执行以下操作:

common = list(master.columns.intersection(new_data.columns))

master = master.merge(new_data, on=common, how='left')

我最终得到了一个非唯一的错误,并且确实有效的更新只是不向列添加任何值,因此只考虑了第一个额外的 Dataframe 。本质上它看起来像这样:

ID  A   B   C   New1    New2    New3    New4
01  1x  1y  1z  01val1  01val2  01val3  n/a
02  2x  2y  2z  -       -       -       -
yacmzcpb

yacmzcpb1#

concat函数完全可以满足您的需要

master = pd.DataFrame([['1x','1y'],['2x','2y']],index=['01','02'],columns=['A','B'])
new1 = pd.DataFrame([['abc','def']],index=['01'],columns=['New1','New2'])
new2 = pd.DataFrame([['sdf','res']],index=['02'],columns=['New1','New3'])

newc =  pd.concat([new1,new2],axis=0)

master.merge(newc,left_index=True,right_index=True)

concat中的列表可以随意展开。

相关问题