2014-09-19 401 views
1

是否有更多pythonic方式將一行插入數據框?我覺得這必須是熊貓的功能,但無法找到它。特別是,有沒有辦法「重置」指數?Python:在數據框中插入一行

謝謝。

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 
    'year': [2000, 2001, 2002, 2001, 2002], 
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]} 
frame = pd.DataFrame(data) 

new = pd.DataFrame(np.zeros(len(frame.columns)).reshape(1,len(frame.columns)),columns=frame.columns) 
row = 3 
def insert_row(frame,new,row): 
    top = frame[0:row] 
    bottom = frame[row:] 
    return pd.concat((top,new,bottom)) 

然而,運行上述回報:

pop state year 
0 1.5 Ohio 2000 
1 1.7 Ohio 2001 
2 3.6 Ohio 2002 
0 0.0  0  0 
3 2.4 Nevada 2001 
4 2.9 Nevada 2002 
+1

DataFrames有一個'reset_index'方法。所以就是這樣。 – 2014-09-19 23:52:21

回答

0

使用loc屬性來分配數據。語法是df.loc[row_index, col_index]。舉個例子:

import pandas 
df = pandas.DataFrame(index=list('abcd'), columns=list('ABCD')) 
df.loc['a', 'A'] = 1 # re-assigns an existing item 
df.loc['b'] = [1, 2, 3, 4] # set the whole row 
df.loc['e', 'E'] = 5 # creates a new row and column 
df = df.reindex(list('abecd')) 
print(df) 

    A B C D E 
a 1 NaN NaN NaN NaN 
b 1 2 3 4 NaN 
e NaN NaN NaN NaN 5 
c NaN NaN NaN NaN NaN 
d NaN NaN NaN NaN NaN 
+0

所以,你說的只是創建一個全新的行,然後將行重新索引到你想插入新行的位置。 我喜歡它。仍然希望有一種內置的方式在所需的位置插入一行。 – 2014-09-20 05:34:59

+0

@ henny.mcil我的編輯回覆清楚了嗎? – 2014-09-20 06:25:14

+0

我瞭解你.loc的功能。我不認爲我對「插入」行的含義很清楚。我不是說追加一行。我的意思是在某個位置插入一行。因此,如果我想在行'b'和'c'之間插入'e'行,我會先df.loc ['e','E'],然後df.reindex('abec d'.split()) – 2014-09-20 06:59:05

0

如果您當前的函數作品不夠好你,我建議只是增加reset_index返回的結果。看到類似如下:

...:  return pd.concat((top,new,bottom)).reset_index(drop=True) 

In [17]: new_frame = insert_row(frame, new, row) 

In [18]: new_frame 
Out[18]: 
    pop state year 
0 1.5 Ohio 2000 
1 1.7 Ohio 2001 
2 3.6 Ohio 2002 
3 0.0  0  0 
4 2.4 Nevada 2001 
5 2.9 Nevada 2002 

參數drop=True強制它刪除舊索引。將其保留在False將舊索引保留爲新的第一列。

+0

感謝您使用reset_index選項。這當然會提高我的代碼。 仍然希望有一個內置的方式來實現這一點。 – 2014-09-20 05:33:00