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 与来自 d​​f1 的索引为 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 行进行比较并分配一个值的主要内容,如果未能解决你的问题,请参考以下文章

遍历 pandas 数据框中的列和行并将字符串转换为浮点数

在循环中将字典附加到熊猫数据框

如何 dcast pandas 数据框并将行转换为列

pandas从数据框中用连续的差异过滤行< n。

Python Pandas 查找所有值为 NaN 的所有行

Python Pandas 数据框行条目不能按条件进行比较