2017-09-15 61 views
4

我有一個數據幀添加一行

value id 
100  1 
200  1 
300  1 
500  2 
600  2 
700  3 

我想組由ID和第1行各組的最後一行之前和之後添加行,使得我的數據框看起來:我加入一行價值0

value id 
0   1 
100  1 
200  1 
300  1 
0   1 
0   2 
500  2 
600  2 
0   2 
0   3 
700  3 
0   3 

現在對每一個組ID的,我想添加順序列這樣的:

value id sequence 
0   1 1 
100  1 2 
200  1 3 
300  1 4 
0   1 5 
0   2 1 
500  2 2 
600  2 3 
0   2 4 
0   3 1 
700  3 2 
0   3 3 

最後一部分很簡單,但我正在尋找如何在每組之前和之後添加行?

+0

什麼是您使用的數據幀的數據結構?字典可能是?向我們展示一些與此實現相關的代碼。 –

+0

@PrakharTrivedi我正在閱讀pandas中的csv文件 – Shubham

+0

讓我看看CSV閱讀代碼片段。我會糾正/編輯它。 –

回答

3

沒那麼容易:

def f(x): 
    x = pd.DataFrame(np.concatenate([np.array([[0, x['id'].iat[0]]]), 
            x.values, 
            np.array([[0, x['id'].iat[0]]])]), columns=x.columns) 
    return (x) 

df = df.groupby('id').apply(f).reset_index(drop=True) 

df['seq'] = df.groupby('id').cumcount() + 1 
print (df) 
    value id seq 
0  0 1 1 
1  100 1 2 
2  200 1 3 
3  300 1 4 
4  0 1 5 
5  0 2 1 
6  500 2 2 
7  600 2 3 
8  0 2 4 
9  0 3 1 
10 700 3 2 
11  0 3 3 
3

讓我們嘗試groupbyapply

df = df.groupby('id')['value']\ 
     .apply(lambda x: pd.Series([0] + x.tolist() + [0]))\ 
     .reset_index().drop('level_1', 1) 
df 
    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 

而現在,使用cumcount的序列。

df['sequence'] = df.groupby('id').cumcount() + 1 

In [228]: df 
Out[228]: 
    id value sequence 
0 1  0   1 
1 1 100   2 
2 1 200   3 
3 1 300   4 
4 1  0   5 
5 2  0   1 
6 2 500   2 
7 2 600   3 
8 2  0   4 
9 3  0   1 
10 3 700   2 
11 3  0   3 
2
data = [zip([k] * (len(group) + 2), [0] + group.values.tolist() + [0]) 
     for k, group in df.groupby('id')['value']] 
df = pd.DataFrame([x for g in data for x in g], columns=['id', 'value']) 
df.assign(sequence=df.groupby(['id'])['value'].transform(
    lambda group: range(1, group.count() + 1))) 
>>> df 
    id value sequence 
0 1  0   1 
1 1 100   2 
2 1 200   3 
3 1 300   4 
4 1  0   5 
5 2  0   1 
6 2 500   2 
7 2 600   3 
8 2  0   4 
9 3  0   1 
10 3 700   2 
11 3  0   3