2014-11-06 55 views
16

我想複製熊貓數據框中的行。每行應重複n次,其中n是每行的一個字段。以列值複製熊貓數據框中的行

import pandas as pd 

what_i_have = pd.DataFrame(data={ 
    'id': ['A', 'B', 'C'], 
    'n' : [ 1, 2, 3], 
    'v' : [ 10, 13, 8] 
}) 

what_i_want = pd.DataFrame(data={ 
    'id': ['A', 'B', 'B', 'C', 'C', 'C'], 
    'v' : [ 10, 13, 13, 8, 8, 8] 
}) 

這可能嗎?

+0

是否有任何理由這樣做呢?我認爲數據重複是最好的避免。 – greole 2014-11-06 11:06:11

+0

這是一箇中間步驟 - 我根據概率分佈生成「v」列,然後通過從另一個數據集中隨機選擇行來添加另一列。 – 2014-11-06 11:34:00

+0

我仍然沒有看到一個不直接做的理由。但是我需要更多關於你實際上想要達到什麼的信息。 – greole 2014-11-06 11:59:57

回答

27

你可以使用np.repeat得到重複索引,然後使用該索引到框架:

>>> df2 = df.loc[np.repeat(df.index.values,df.n)] 
>>> df2 
    id n v 
0 A 1 10 
1 B 2 13 
1 B 2 13 
2 C 3 8 
2 C 3 8 
2 C 3 8 

之後,有隻有一點點清理做的:

>>> df2 = df2.drop("n",axis=1).reset_index(drop=True) 
>>> df2 
    id v 
0 A 10 
1 B 13 
2 B 13 
3 C 8 
4 C 8 
5 C 8 

注如果你可能有重複的指標擔心,你可以使用.iloc代替:

In [86]: df.iloc[np.repeat(np.arange(len(df)), df["n"])].drop("n", axis=1).reset_index(drop=True) 
Out[86]: 
    id v 
0 A 10 
1 B 13 
2 B 13 
3 C 8 
4 C 8 
5 C 8 

它使用的是位置,而不是索引標籤。

+2

使用較新的版本,可以使用'df.loc [df.index.repeat(df.n)]' – Zero 2017-09-09 18:37:45

2

你可以使用​​和repeat

In [1057]: df.set_index(['id'])['v'].repeat(df['n']).reset_index() 
Out[1057]: 
    id v 
0 A 10 
1 B 13 
2 B 13 
3 C 8 
4 C 8 
5 C 8 

詳細

In [1058]: df 
Out[1058]: 
    id n v 
0 A 1 10 
1 B 2 13 
2 C 3 8