[英]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,然后where
和loc
填充列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.