[英]Add new column for next consecutive row in pandas dataframe
我有一个数据框:
id value
0 1 0
1 1 100
2 1 200
3 1 300
4 1 0
5 2 0
6 2 500
7 2 600
8 2 0
9 3 0
10 3 700
11 3 0
对于值列中的每个条目,我要添加一个新列,该列属于值列中的下一行条目,
例如:
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
4 2 0 500
5 2 500 600
6 2 600 0
7 3 0 700
8 3 700 0
选项1
通过使用numpy而不是pd.Series.shift
我避免了插入np.nan
并将其强制转换为float
df.groupby(
'id', group_keys=False
).apply(lambda d: d.iloc[:-1].assign(value2=d.value.values[1:]))
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
5 2 0 500
6 2 500 600
7 2 600 0
9 3 0 700
10 3 700 0
选项2
如果您所有的'id'
都集中在一起,那么我可以对整个列进行一次np.roll
,然后再进行简单的groupby
。
df.assign(
value2=np.roll(df.value.values, -1)
).groupby('id', group_keys=False).apply(pd.DataFrame.head, n=-1)
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
5 2 0 500
6 2 500 600
7 2 600 0
9 3 0 700
10 3 700 0
您可以使用groupby
和shift
,然后使用dropna
。
df['value2'] = df.groupby('id').value.shift(-1)
df = df.dropna().astype(int)
df
id value value2
0 1 0 100
1 1 100 200
2 1 200 300
3 1 300 0
5 2 0 500
6 2 500 600
7 2 600 0
9 3 0 700
10 3 700 0
我尝试以另一种方式查看问题-使用numpy.append
从上一个问题中使用原始df
创建输出:
print (df)
value id
0 100 1
1 200 1
2 300 1
3 500 2
4 600 2
5 700 3
def f(x):
return pd.DataFrame({'value1': np.append(x, 0), 'value2': np.append(0, x)})
df = df.groupby('id')['value'].apply(f).reset_index(level=1, drop=True).reset_index()
print (df)
id value1 value2
0 1 100 0
1 1 200 100
2 1 300 200
3 1 0 300
4 2 500 0
5 2 600 500
6 2 0 600
7 3 700 0
8 3 0 700
像这样的东西:
n = 1
df["value2"] = df["value1"].tolist()[n:] + df["value1"].tolist()[:n]
这里n是行的移位量
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.