【问题标题】:Comparing every values columns and rows in dataframes比较数据框中的每个值列和行
【发布时间】:2016-07-16 04:06:24
【问题描述】:

我有两个不同大小的数据框,我想对四个不同列中的所有值进行比较,(两组两个)

基本上我想看看 df1['A'] == df2['A'] & where df1['B'] == df2['B'] 并返回 df1['C']'s值加上 df2['C'] 的值

import pandas as pd
df1 = pd.DataFrame({"A": [1, 2, 3, 4, 3], "B": [2, 5, 4, 7, 5], "C": [1, 2, 8, 0, 0]})
df2 = pd.DataFrame({"A": [1, 3, 2, 4, 8], "B": [5, 5, 4, 9, 1], "C": [1, 3, 3, 4, 6]})


df1:
  A B C
0 1 2 1
1 2 5 2
2 3 4 8
3 4 7 0
4 3 5 0
...

df2:
  A B C
0 1 5 1
1 3 4 3
2 2 5 4
3 4 9 4
5 8 1 6
...

in: df1['A'] == df2['A'] & where df1['B'] == df2['B']
       df1['D'] = df1['C'] + df2['C'] 

out: df1:
  A B C D
0 1 2 1 nan
1 2 5 2 6
2 3 4 8 11
3 4 7 0 nan
4 3 5 0 nan

我的实际数据框要大得多(120000 行数据,“A”列的值从 1 到 700,“B”从 1 到 300)所以我知道这可能是一个更长的过程。

【问题讨论】:

  • 我还想说两列 'A' 中的数字重复了几次,把它想象成网格平面上的两组数据,其中有一个列和一个专用于每个单元格的行号,我需要在两个单元格相等的情况下进行数学运算(两行相等,两列相等)在这种情况下,我将它们分别命名为“A”和“B”,但那是为了避免混淆,我敢肯定,我做得不太好。

标签: python pandas dataframe


【解决方案1】:

您可以merge 列 A 和 B 上的两个 DataFrames。由于您想保留来自 df1 的所有值,请对 df1df2 进行左合并。来自df2 的合并列 C 将在 A 和 B 不匹配的地方为空。合并后,只需对合并后的列进行重命名并求和即可。

# Do a left merge, keeping df1 column names unchanged.
df1 = pd.merge(df1, df2, how='left', on=['A', 'B'], suffixes=('', '_2'))

# Add the two columns, fill locations that don't match with zero, and rename.
df1['C_2'] = df1['C_2'].add(df1['C']).fillna(0)
df1.rename(columns={'C_2': 'D'}, inplace=True)

【讨论】:

    【解决方案2】:

    你可以先合并两个数据框

    In [145]: dff = pd.merge(df1, df2, on=['A', 'B'], how='left')
    
    In [146]: dff
    Out[146]:
       A  B  C_x  C_y
    0  1  2    1  NaN
    1  2  5    2    4
    2  3  4    8    3
    3  4  7    0  NaN
    

    然后,对不存在空值的C_-{like} 列进行逐行求和,然后用零填充 NaN。

    In [147]: dff['C'] = dff.filter(regex='C_').sum(skipna=False, axis=1).fillna(0)
    
    In [148]: dff
    Out[148]:
       A  B  C_x  C_y   C
    0  1  2    1  NaN   0
    1  2  5    2    4   6
    2  3  4    8    3  11
    3  4  7    0  NaN   0
    

    而且,您可以删除/选择所需的列。

    【讨论】:

    • 感谢您的帮助,我明白您在说什么,但我忘了提到的是,在 df 的“A”列和“B”列中都有很多重复的数字“A”为 1-700,“B”为 1-300。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2022-08-18
    • 1970-01-01
    • 2018-03-14
    • 2015-03-23
    • 2017-03-08
    相关资源
    最近更新 更多