Python 熊猫:批量替换满足相同标准的不同行中的值

Python 熊猫:批量替换满足相同标准的不同行中的值,python,pandas,batch-processing,Python,Pandas,Batch Processing,我从sql server中提取了一些熊猫格式的数据。结构如下: df = pd.DataFrame({'Day':(1,2,3,4,1,2,3,4),'State':('A','A','A','A','B','B','B','B'),'Direction':('N','S','N','S','N','S','N','S'),'values':(12,34,22,37,14,16,23,43)}) >>> df Day Direction State values

我从sql server中提取了一些熊猫格式的数据。结构如下:

df = pd.DataFrame({'Day':(1,2,3,4,1,2,3,4),'State':('A','A','A','A','B','B','B','B'),'Direction':('N','S','N','S','N','S','N','S'),'values':(12,34,22,37,14,16,23,43)})

 >>> df
    Day Direction State  values
0    1         N     A      12
1    2         S     A      34
2    3         N     A      22
3    4         S     A      37
4    1         N     B      14
5    2         S     B      16
6    3         N     B      23
7    4         S     B      43
df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'] = df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'].values + df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'B'),'values'].values

>>> df
   Day Direction State  values
0    1         N     A      26
1    2         S     A      34
2    3         N     A      22
3    4         S     A      37
4    1         N     B      14
5    2         S     B      16
6    3         N     B      23
7    4         S     B      43
现在我想用(State==A)本身替换所有具有相同日期和相同方向的值+具有相同日期和相同状态但具有(State==B)的值。例如,像这样:

df = pd.DataFrame({'Day':(1,2,3,4,1,2,3,4),'State':('A','A','A','A','B','B','B','B'),'Direction':('N','S','N','S','N','S','N','S'),'values':(12,34,22,37,14,16,23,43)})

 >>> df
    Day Direction State  values
0    1         N     A      12
1    2         S     A      34
2    3         N     A      22
3    4         S     A      37
4    1         N     B      14
5    2         S     B      16
6    3         N     B      23
7    4         S     B      43
df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'] = df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'].values + df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'B'),'values'].values

>>> df
   Day Direction State  values
0    1         N     A      26
1    2         S     A      34
2    3         N     A      22
3    4         S     A      37
4    1         N     B      14
5    2         S     B      16
6    3         N     B      23
7    4         S     B      43
请注意,第一行的值已从12更改为26(12+14) 因为值来自不同的行,所以很难使用combine_first函数


现在我必须使用两个循环(在“Day”和“Direction”上)和上面的归因语句,当数据帧变大时,它的速度非常慢。你有什么聪明而有效的方法吗?

你可以先定义一个函数,在同一个组中将值从B添加到a。然后将此函数应用于每个组

def f(x):
    x.loc[x.State=='A','values']+=x.loc[x.State=='B','values'].iloc[0]
    return x

df.groupby(['Day','Direction']).apply(f)
Out[94]: 
   Day Direction State  values
0    1         N     A      26
1    2         S     A      50
2    3         N     A      45
3    4         S     A      80
4    1         N     B      14
5    2         S     B      16
6    3         N     B      23
7    4         S     B      43

哦,groupby和apply:funcs的可爱伴侣。作为一个新手,总是对自己能做的感到很棒,但仍然需要更多的训练来掌握它们。非常感谢,伙计,不用担心。如果你觉得答案有用,请接受。