为pandas dataframe中的下一个连续行添加新列

时间:2017-09-15 05:14:56

标签: python 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

对于value列中的每个条目,我想添加属于value列中下一行条目的新列,

例如:

     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 

4 个答案:

答案 0 :(得分:3)

选项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

答案 1 :(得分:3)

您可以使用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

答案 2 :(得分:3)

我尝试以另一种方式查看问题 - 使用numpy.append上一个问题创建原始override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { var numberOfRows = super.tableView(tableView, numberOfRowsInSection: section) if (section == RepeatSection && shouldHideRepeatEnd()) { numberOfRows = numberOfRows - 1 } return numberOfRows } 的输出:

df

答案 3 :(得分:1)

这样的事情:

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

这里n是行中的移位量