Pandas 循环数据框并将所有行与其他 DF 行进行比较并分配一个值
Posted
技术标签:
【中文标题】Pandas 循环数据框并将所有行与其他 DF 行进行比较并分配一个值【英文标题】:Pandas loop a dataframe and compare all rows with other DF rows and assign a value 【发布时间】:2018-04-08 09:04:54 【问题描述】:我有两个 DF:
df1 = pd.DataFrame('A':[3, 2, 5, 1, 6], 'B': [4, 6, 5, 8, 2], 'C': [4, 8, 3, 8, 0], 'D':[1, 4, 2, 8, 7], 'zebra': [5, 7, 2, 4, 8])
df2 = pd.DataFrame('B': [7, 3, 5, 1, 8], 'D':[4, 5, 8, 2, 3] )
print(df1)
print(df2)
A B C D zebra
0 3 4 4 1 5
1 2 8 8 5 7
2 5 5 3 2 2
3 1 6 8 5 4
4 6 2 0 7 8
B D
0 7 4
1 3 5
2 5 8
3 8 5
4 8 3
这是一个简单的例子,实际上 df1 有 1000k+ 行和 10+ 列,df2 只有 24 行和更少的列。我想循环df2中的所有行并将df2中的那些特定行(例如列'B'和'D')与df1中的相同列名进行比较,如果行值匹配(如果B列和D列中的值在df2 匹配相同列但在 df1) 中的相同值,以将该行中的相应斑马值分配给 df2 中的同一行,创建新列斑马并分配该值。如果没有找到匹配来分配 0 或 NaN。
B D zebra
0 7 4 nan
1 3 5 nan
2 5 8 nan
3 8 5 7
4 8 3 nan
从示例中,仅 df2 中的行索引 3 匹配值 'B': 8 和 'D':5 与来自 df1 的索引为 2 的行(注意:行索引在比较中不应该很重要)并分配相应的行值7 从“斑马”列到 df2。
【问题讨论】:
【参考方案1】:合并就可以了
df2.merge(df1[['B', 'D', 'zebra']], on = ['B', 'D'], how = 'left')
B D zebra
0 7 4 NaN
1 3 5 NaN
2 5 8 NaN
3 8 5 7.0
4 8 3 NaN
【讨论】:
差不多,它在 d2 中创建的行数超过了 24 个原始行。此外,df2 中还有其他列,因为 df1 只是没有提及它以使更多混淆,但也需要准确(但是不要比较它们)。在 df1 中有 14k 行,可能有超过 1 个具有相同值的组合。 df2.merge 后创建 14k 行。 当您在 [B, D] 上合并时,它只会比较这 2 列,因此您不必担心 df2 中存在更多列。我对行数感到惊讶。您在 df2 中获得了多少行?以上是关于Pandas 循环数据框并将所有行与其他 DF 行进行比较并分配一个值的主要内容,如果未能解决你的问题,请参考以下文章