Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按列比较两个数据帧的行,并保持较大和总和_Python_Numpy_Pandas_Dataframe - Fatal编程技术网

Python 按列比较两个数据帧的行,并保持较大和总和

Python 按列比较两个数据帧的行,并保持较大和总和,python,numpy,pandas,dataframe,Python,Numpy,Pandas,Dataframe,我有两个具有相同ID且结构相同的数据帧: X, Y, Value, ID 两者之间的唯一区别应该是列Value中的值-可能需要先按ID排序,以便两者具有相同的行顺序以确保 我想根据列值逐行比较这两个数据帧,并根据值较大的位置将行与第一行或第二行分开。我还想看看如何为两个数据帧中的值和列添加额外的列和 我会很高兴为任何例子,包括使用numpy,如果你觉得这是更好的使用比熊猫 编辑:在测试第一个答案中的示例后,我刚刚意识到,我拥有的数据帧完全缺少ID为null的行。这使得两个数据帧的行数不同。因此

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

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

我想根据列值逐行比较这两个数据帧,并根据值较大的位置将行与第一行或第二行分开。我还想看看如何为两个数据帧中的值和列添加额外的列和

我会很高兴为任何例子,包括使用numpy,如果你觉得这是更好的使用比熊猫

编辑:在测试第一个答案中的示例后,我刚刚意识到,我拥有的数据帧完全缺少ID为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()
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

没有解释也没有用。例如,什么是
df1
df2
?此外,我没有看到上面提到的排序。哇,这非常简单,而且工作完全符合我的需要。我以前看过concat和merge,但对我来说没有意义,因为我完全没有意识到可以使用groupby函数。不过,上面建议的一些评论会很好。我真的很喜欢这种方法,当数据帧大小相同时它也能工作,但不幸的是,在测试这种方法时,我意识到我的数据帧缺少具有空值的行。
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