Pandas:批量替换满足相同条件的不同行的值
Pandas: batch subsitution of values from different rows meeting same criterias
我从 sql 服务器中提取了一些 pandas 格式的数据。结构如下:
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
现在我想用相同的日期和相同的方向但用 (State == A) 本身替换所有值 + 具有相同的日期和相同的状态但用 (State == B) 的值。例如,像这样:
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
我从 sql 服务器中提取了一些 pandas 格式的数据。结构如下:
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
现在我想用相同的日期和相同的方向但用 (State == A) 本身替换所有值 + 具有相同的日期和相同的状态但用 (State == B) 的值。例如,像这样:
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