我有一个数据框
full_name x
q 1.5
q_1 1.3
q_2 1.2
q_3 1.3
r 1.5
r_1 1.3
r_2 1.2
r_3 1.3
并且我想创建一个新列,该列是后缀全名与其基数之间的区别,例如:
full_name x x_diff
q 1.5 0
q_1 1.3 -0.2
q_2 1.2 -0.3
q_3 1.3 -0.2
r 1.5 0
r_1 1.3 -0.2
r_2 1.2 -0.3
r_3 1.3 -0.2
因此,q
-q
,q_1
-q
,q_2
-q
,q_3
-{{1 }},与q
相同。
我已经尝试过类似r
之类的方法,但这不起作用。有什么建议吗?
答案 0 :(得分:1)
为Series
与DataFrame.set_index
匹配的main_name
创建full_name
,然后减去Series.map
ed main_name
:
s = df.loc[df.main_name == df.full_name].set_index('main_name')['x']
df['x_diff'] = df.x - df.main_name.map(s)
print (df)
full_name main_name x x_diff
0 q q 1.5 0.0
1 q_1 q 1.3 -0.2
2 q_2 q 1.2 -0.3
3 q_3 q 1.3 -0.2
4 r r 1.5 0.0
5 r_1 r 1.3 -0.2
6 r_2 r 1.2 -0.3
7 r_3 r 1.3 -0.2
如果始终main_name
中每个组的第一个值等于full_name
,则将GroupBy.first
创建的Series
与GroupBy.transform
相减:
df['x_diff'] = df.x - df.groupby('main_name')['x'].transform('first')
答案 1 :(得分:0)
您可以通过3个步骤进行操作:
main_name
df.shift(1)
(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shift.html)x_diff
和x_shifted
之间的区别的列x