我是熊猫新手。我有一个像这样的Pandas数据框:
df = pd.DataFrame(data={'id': [1, 1, 1, 2, 2, 2, 2], 'val1': [0, 1, 0, 0, 1, 0, 0]})
我想添加一个列val2
,用于指示某行是否位于与id
所在地val1 == 1
相同的另一行之下。
结果将是一个数据框,如:
df = pd.DataFrame(data={'id': [1, 1, 1, 2, 2, 2, 2], 'val1': [0, 1, 0, 0, 1, 0, 0], 'val2': [0, 0, 1, 0, 0, 1, 1]})
我的第一个想法是使用apply语句,但这些只是按行进行。从我的循环经验来看,永远不是答案。任何帮助将不胜感激!
答案 0 :(得分:5)
让我们在shift
内尝试cumsum
+ groupby
。
df['val2'] = df.groupby('id').val1.apply(
lambda x: x.shift().cumsum()
).ge(1).astype(int)
或者,试图避开lambda
,
df['val2'] = (
df.groupby('id')
.val1.shift()
.groupby(df.id)
.cumsum()
.ge(1)
.astype(int)
)
df
id val1 val2
0 1 0 0
1 1 1 0
2 1 0 1
3 2 0 0
4 2 1 0
5 2 0 1
6 2 0 1
答案 1 :(得分:1)
使用groupby
+ transform
。与coldspeed相似,但使用bool
转换为非零cumsum
值。
df['val2'] = df.groupby('id')['val1'].transform(lambda x: x.cumsum().shift())\
.fillna(0).astype(bool).astype(int)
print(df)
id val1 val2
0 1 0 0
1 1 1 0
2 1 0 1
3 2 0 0
4 2 1 0
5 2 0 1
6 2 0 1