Pandas groupby条件减法

时间:2018-02-21 18:53:53

标签: python pandas

我尝试根据条件减法创建新列。我想先从A列对数据帧进行分组,然后取C的行值,其中B为最小值,并从C列中的所有值中减去该值。

import pandas as pd

data = [
["R", 1, 2],
["R", 2, 4],
["R", 3, 6],
["R", 4, 8],
["S", 0, 5],
["S", 1, 4],
["S", 2, 1],
["S", 3, 3]]
df = pd.DataFrame(data=data, columns=["a", "b", "c"])
df

Out[1]:
    a   b   c
0   R   1   2
1   R   2   4
2   R   3   6
3   R   4   8
4   S   0   5
5   S   1   4
6   S   2   1
7   S   3   3

希望它能够产生一个列' d'的:

Out[2]:
    a   b   c    d
0   R   1   2    0
1   R   2   4    2
2   R   3   6    4
3   R   4   8    6
4   S   0   5    0
5   S   1   4   -1
6   S   2   1   -4
7   S   3   3   -2

任何人都有任何好的pythonic方式吗?

由于

3 个答案:

答案 0 :(得分:4)

使用

In [591]: df['d'] = df['c'] - df.loc[df.groupby('a')['b'].transform('idxmin'), 'c'].values

In [592]: df
Out[592]:
   a  b  c  d
0  R  1  2  0
1  R  2  4  2
2  R  3  6  4
3  R  4  8  6
4  S  0  5  0
5  S  1  4 -1
6  S  2  1 -4
7  S  3  3 -2

答案 1 :(得分:4)

postgres=# select * from customer where customer_id in ();
ERROR:  syntax error at or near ")"

答案 2 :(得分:1)

没有退出效率,但工作

df['d']=df.groupby('a').apply(lambda x : x['c']-x['c'][x['b']==x['b'].min()].values).values
df
Out[1305]: 
   a  b  c  d
0  R  1  2  0
1  R  2  4  2
2  R  3  6  4
3  R  4  8  6
4  S  0  5  0
5  S  1  4 -1
6  S  2  1 -4
7  S  3  3 -2