我有一个数据框:
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
答案 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)
您可以使用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
答案 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是行中的移位量