【问题标题】:Pandas add a column of value of next row in another column (per group)熊猫在另一列(每组)中添加下一行的一列值
【发布时间】:2022-11-07 23:19:40
【问题描述】:
我有数据框:
df = batch Code
a 100
a 120
a 130
a 120
b 140
b 150
c 100
我想添加一个列“add_code”,它将是每批下一行中“代码”列的值。
所以输出将是:
df = batch Code next_code
a 100 120
a 120 130
a 130 120
a 120 END
b 140 150
b 150 END
c 100 END
最好的方法是什么?
【问题讨论】:
标签:
pandas
dataframe
data-science
data-munging
【解决方案1】:
使用 DataFrameGroupBy.shift 和 fill_value 参数:
df['next_code'] = df.groupby('batch')['Code'].shift(-1, fill_value='END')
print (df)
batch Code next_code
0 a 100 120
1 a 120 130
2 a 130 120
3 a 120 END
4 b 140 150
5 b 150 END
6 c 100 END
或者使用 Series.fillna 获取旧熊猫版本:
df['next_code'] = df.groupby('batch')['Code'].shift(-1).fillna('END')
print (df)
batch Code next_code
0 a 100 120.0
1 a 120 130.0
2 a 130 120.0
3 a 120 END
4 b 140 150.0
5 b 150 END
6 c 100 END
【解决方案2】:
您可以尝试使用 groupby 和 apply 方法来解决这个问题。
import pandas as pd
def next_code(x):
return x.shift(-1).fillna('END')
df = pd.DataFrame({
"batch" : ['a','a','a','a','b','b','c'],
"code" : [100,120,130,120,140,150,100]
})
df['next_code'] = df.groupby(['batch'])['code'].apply(lambda x: next_code(x))
print(df)
输出:
batch code next_code
0 a 100 120.0
1 a 120 130.0
2 a 130 120.0
3 a 120 END
4 b 140 150.0
5 b 150 END
6 c 100 END