簡體   English   中英

按列比較2個熊貓數據幀的行,並保持更大和求和

[英]Compare rows of 2 pandas data frames by column and keep bigger and sum

我有兩個具有相同ID且結構相同的數據框:

X, Y, Value, ID

兩者之間的唯一區別應該是Value列中的值-可能需要先按ID排序,以確保兩者具有相同的行順序。

我想根據“值”列按行比較這兩個數據幀,並根據值較大的位置將行排在第一或第二位。 我還要查看示例示例,如何為兩個數據幀中的Value列的總和添加其他列SUM。

我會為任何示例感到高興,包括使用numpy,如果您覺得使用它比熊貓更好。

編輯:從第一個答案測試完示例后,我才意識到我的數據幀完全丟失了ID為Value為null的行。 這使得兩個數據幀的行數不同。 因此,可能還需要包括在比較之前如何使它們具有相同的大小-將ID缺失的行與ID和零相互添加的行?

import numpy as np

# create a new dataframe, where Value is the max value per row
val1 = df1['Value']
val2 = df2['Value'][val1.index]  # align to val1
df = df1.copy()
df['Value'] = np.maximum(val1, val2)

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

我用reindex_like為對齊dataframes,然后whereloc填充列Value的新數據幀的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM