繁体   English   中英

在熊猫数据框中为下一个连续行添加新列

[英]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

您可以使用groupbyshift ,然后使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM