我试图弄清楚如何实现以下内容。假设我有一个主 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 - - - -
1条答案
按热度按时间yacmzcpb1#
concat
函数完全可以满足您的需要concat
中的列表可以随意展开。