按列比较2个pandas数据帧的行并保持更大并求和

时间:2015-12-11 02:39:06

标签: python numpy pandas dataframe

我有两个相同ID且结构相同的数据框:

X, Y, Value, ID

两者之间的唯一区别应该是列值中的值 - 可能需要先按ID排序,以便两者具有相同的行顺序以确保。

我想基于列Value逐行比较这两个数据帧,并根据值更大的位置保留第一行或第二行。我还想看看如何为两个数据帧中的Value列的总和添加附加列SUM的示例。

我会很高兴任何一个例子,包括使用numpy如果你认为使用numpy比Pandas更好。

编辑:我刚刚在第一个答案中测试了这个例子后才意识到我的数据框完全没有带有ID为null的行。这使得两个数据帧具有不同的行数。那么还可以包括如何在比较之前使它们的大小相同 - 使用ID和零添加彼此缺少id的行?

3 个答案:

答案 0 :(得分:2)

"date": {
    "#text": "11 Dec 2015, 01:41", 
    "uts": "1449798068"
}, 

答案 1 :(得分:1)

df = (pd.concat([df1, df2])
      .groupby(['ID','X','Y'])
      .agg({'value':'max', 'value_sum':'sum'}))

答案 2 :(得分:1)

我使用reindex_like来对齐数据框,然后使用whereloc来填充新数据框df的列print df1 X Y Value ID 0 1 4 10 0 1 2 5 55 1 2 3 6 21 2 print df2 X Y Value ID 0 2 5 7 1 1 3 6 34 2

#align dataframes
df1 = df1.set_index('ID')
df2 = df2.set_index('ID')
df2 = df2.reindex_like(df1)
print df2
     X   Y  Value
ID               
0  NaN NaN    NaN
1    2   5      7
2    3   6     34
#create new df
df = df1.copy()
df['Value'] = df1['Value'].where(df1['Value'] > df2['Value'], df2['Value'])
#if value is NaN in column df2 give value of column1
df.loc[df2['Value'].isnull(), 'Value'] = df1['Value']
print df
    X  Y  Value
ID             
0   1  4     10
1   2  5     55
2   3  6     34
#sum columns Value to columns SUM 
df1['SUM'] = df1['Value'].sum()
df2['SUM'] = df2['Value'].sum()
print df1
    X  Y  Value  SUM
ID                  
0   1  4     10   86
1   2  5     55   86
2   3  6     21   86

#remove rows with NaN
print df2.dropna()
    X  Y  Value  SUM
ID                  
1   2  5      7   41
2   3  6     34   41
<input type="text" class="form-control login-field" value=""
       placeholder="Username / Company Name" id="login-name"  name="email" />
<input type="password" class="form-control login-field" value=""
       placeholder="Password" id="login-pass" name="password" />