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

python pandas dataframe

614 观看

4回复

2141 作者的声誉

我有一个数据框:

    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 
作者: Shubham 的来源 发布者: 2017 年 9 月 15 日

回应 4


3

179274 作者的声誉

决定

选项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
作者: piRSquared 发布者: 2017 年 9 月 15 日

1

1008 作者的声誉

像这样的东西:

n = 1
df["value2"] = df["value1"].tolist()[n:] + df["value1"].tolist()[:n]

这里n是行的移位量

作者: Alexey Trofimov 发布者: 2017 年 9 月 15 日

3

168868 作者的声誉

您可以使用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
作者: cs95 发布者: 2017 年 9 月 15 日

3

415987 作者的声誉

我尝试以另一种方式查看问题-使用以下df问题从原始问题创建输出numpy.append

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
作者: jezrael 发布者: 2017 年 9 月 15 日
32x32