Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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_Pandas_Pandas Groupby - Fatal编程技术网

Python 如何比较行值和来自另一个数据帧的组值之和?

Python 如何比较行值和来自另一个数据帧的组值之和?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有两个数据帧,看起来像这样 df1 = pd.DataFrame({'A': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], 'B': ['C1', 'C1', 'C1', 'C1', 'C2', 'C2', 'C2', 'C2'], 'Y': [0, 1, 1, 0, 1, 1, 0, 1], 'Z': [4, 5, 2, 1, 2, 1

我有两个数据帧,看起来像这样

df1 = pd.DataFrame({'A': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
                    'B': ['C1', 'C1', 'C1', 'C1', 'C2', 'C2', 'C2', 'C2'],
                    'Y': [0, 1, 1, 0, 1, 1, 0, 1],
                    'Z': [4, 5, 2, 1, 2, 1, 3, 5]})
Out[51]: 
   A   B  Y  Z
0  A  C1  0  4
1  B  C1  1  5
2  C  C1  1  2
3  D  C1  0  1
4  E  C2  1  2
5  F  C2  1  1
6  G  C2  0  3
7  H  C2  1  5

df2 = pd.DataFrame({'A': ['A', 'B', 'E', 'F', 'H'],
                    'B': ['C1', 'C1', 'C2', 'C2', 'C2'],
                    'V': [2, 3, 1, 4, 2]})
Out[52]: 
   A   B  V
0  A  C1  2
1  B  C1  3
2  E  C2  1
3  F  C2  4
4  H  C2  2

我想选择df1中Y==1和Z.cumsum()的所有行,您可以使用df1.B上的
map
和df2的结果。请注意,我使用了
where
和not
loc
,它们只是将Z中的值替换为nan,而不是Y==1

print(df1[df1['Z'].where(df1['Y']==1).groupby(df1['B']).cumsum()
          <=df1['B'].map(df2.groupby('B')['V'].sum())])
   A   B  Y  Z
1  B  C1  1  5
4  E  C2  1  2
5  F  C2  1  1
print(df1[df1['Z'].where(df1['Y']==1).groupby(df1['B']).cumsum()

您可以使用df1.B上的
map
和来自df2的结果。请注意,我使用
where
和not
loc
来替换Z中不是Y==1的值

print(df1[df1['Z'].where(df1['Y']==1).groupby(df1['B']).cumsum()
          <=df1['B'].map(df2.groupby('B')['V'].sum())])
   A   B  Y  Z
1  B  C1  1  5
4  E  C2  1  2
5  F  C2  1  1
print(df1[df1['Z'].where(df1['Y']==1).groupby(df1['B']).cumsum()
print(df1[df1['Z'].where(df1['Y']==1).groupby(df1['B']).cumsum()
          <=df1['B'].map(df2.groupby('B')['V'].sum())])
   A   B  Y  Z
1  B  C1  1  5
4  E  C2  1  2
5  F  C2  1  1