2017-09-15 161 views
1

我有一个数据帧:添加新列在大熊猫数据帧下一连续行

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 
+0

你为什么要加入行4,8,并从原来的数据帧11。这些都是组中最后一个在样本数据中碰巧具有零值的项目。我们是否应该认为这总是可以放弃? – Alexander

回答

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'集中在一起,我可以在整列,并以一个简单的groupby事后做一个np.roll

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

避免NaNs的优点是什么?只是为了铸造? –

+0

OP或其他人可能会因为任何原因想要保留整数dtype。整数是OP显示的预期结果。整数是确切的。浮动不是。 – piRSquared

+0

由此我缺少值为0的行。我即将获得组合100-200,200-300,500-600等等 – Shubham

1

财产以后这样的:

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

这里n是行

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 
3

我尝试看问题的另一种方式 - 创建一个从前面的问题与原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 
+1

好用的追加 – piRSquared

+1

@jezrael好:) – Shubham