2016-10-17 252 views
1

我正在尋找基於特定條件在兩個現有行之間的數據框中插入一行。熊貓/ Python基於條件添加行

例如,我的數據幀:

import pandas as pd 
    df = pd.DataFrame({'Col1':['A','B','D','E'],'Col2':['B', 'C', 'E', 'F'], 'Col3':['1', '1', '1', '1']}) 

它看起來像:

Col1 Col2 Col3 
    0 A  B  1 
    1 B  C  1 
    2 D  E  1 
    3 E  F  1 

我希望能夠插入索引1和索引2中給出的條件之間的新行:

n = 0 
while n < len(df): 
    (df.ix[n]['Col2'] == df.ix[n+1]['Col1']) == False 
    Something, Something, insert row 
    n+=1 

我想要的輸出表如下所示:

Col1 Col2 Col3 
    0 A  B  1 
    1 B  C  1 
    2 C  D  1 
    3 D  E  1 
    4 E  F  1 

我很努力地根據前面和前面的記錄中的值條件插入行。我最終希望在我的真實世界的例子中進行上述練習,其中包括多個條件,並保留多個列的值(在本例中爲Col3,但在我的現實世界中,它將是多列)

+0

這可能是更容易插入的列而不是行。也許你可以先調換數據幀,將新數據作爲新列插入,然後重新轉置以恢復原始表。只是一個猜測。 –

+0

什麼決定了新行的內容?是否會像玩具例子那樣「修復」序列? – ASGM

+0

@Tammo Heeren,我會給你一個機會,看看這是否有益。 @ ASGM,新行的內容是Col1從前一行獲取Col2的值,Col2從前進的行獲取Col1的值,同時爲所有其他列獲取前一行的值。一個很好的例子是在我期望的輸出表中,我將Col1和Col2的值作爲C和D(前一個Col1和繼續Col1),同時將Col3的值(Col3前一個值)作爲1。讓我知道,如果這是有道理的 – Mike

回答

0

UPDATE:存儲器中保存方法 - 先設置一個新的索引與新行差距:

In [30]: df 
Out[30]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
2 D E 1 
3 E F 1 

如果我們要插入索引12之間的新行,我們在2位置拆分指數:

In [31]: idxs = np.split(df.index, 2) 

設置一個新的指數(與差距在位置2):

In [32]: df.set_index(idxs[0].union(idxs[1] + 1), inplace=True) 

In [33]: df 
Out[33]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
3 D E 1 
4 E F 1 

插入新行的索引2

In [34]: df.loc[2] = ['X','X',2] 

In [35]: df 
Out[35]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
3 D E 1 
4 E F 1 
2 X X 2 

排序索引:

In [38]: df.sort_index(inplace=True) 

In [39]: df 
Out[39]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
2 X X 2 
3 D E 1 
4 E F 1 

PS你也可以插入數據幀代替單行使用df.append(new_df)

In [42]: df 
Out[42]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
2 D E 1 
3 E F 1 

In [43]: idxs = np.split(df.index, 2) 

In [45]: new_df = pd.DataFrame([['X', 'X', 10], ['Y','Y',11]], columns=df.columns) 

In [49]: new_df.index += idxs[1].min() 

In [51]: new_df 
Out[51]: 
    Col1 Col2 Col3 
2 X X 10 
3 Y Y 11 

In [52]: df = df.set_index(idxs[0].union(idxs[1]+len(new_df))) 

In [53]: df 
Out[53]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
4 D E 1 
5 E F 1 

In [54]: df = df.append(new_df) 

In [55]: df 
Out[55]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
4 D E 1 
5 E F 1 
2 X X 10 
3 Y Y 11 

In [56]: df.sort_index(inplace=True) 

In [57]: df 
Out[57]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
2 X X 10 
3 Y Y 11 
4 D E 1 
5 E F 1 

OLD答案:

一個(在許多)的方式來實現,這將是分裂的DF和期望的順序與需要的DF級連在一起的:

原DF:

In [12]: df 
Out[12]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
2 D E 1 
3 E F 1 

讓我們把它分割成兩個部分([0:1],[2:結束):

In [13]: dfs = np.split(df, [2]) 

In [14]: dfs 
Out[14]: 
[ Col1 Col2 Col3 
0 A B 1 
1 B C 1, Col1 Col2 Col3 
2 D E 1 
3 E F 1] 

現在我們可以一起用新的DF所需順序串連它:

In [15]: pd.concat([dfs[0], pd.DataFrame([['C','D', 1]], columns=df.columns), dfs[1]], ignore_index=True) 
Out[15]: 
    Col1 Col2 Col3 
0 A B 1 
1 B C 1 
2 C D 1 
3 D E 1 
4 E F 1