2017-08-16 511 views
2

使用Python中的熊貓數據幀:條件在循環

我想從一個數據幀以下數據和無法修復我的循環,以獲得正確的結果。

數據集的小樣本:

BERTH  FROM_BERTH  BI 
29   H2    0 
29   09    0 
29   J5    0 
C5   NaN   1 
J4   NaN   1 
J2   NaN   1 

這裏是數據集(相關列我需要使用)和這裏的一部分是我想要的輸出看起來像:

29, H2, 09, J5, C5, J4, J2 

即:如果BI爲0,我希望BERTH的值,然後是FROM_BERTH的值,直到BI變爲1,然後返回給我BERTH(直到BI再次變爲1,等等)。

這裏有以下代碼我試圖及其結果:

test_berth2 = [] 

for i in range(0,6): 
    if df3_test.loc[i,'BI'] == 0 & df3_test.iloc[i,21] != df3.iloc[i-1,21]: 
     test_berth2.append(df3_test.loc[i,'BERTH']) 
     test_berth2.append(df3_test.loc[i,'FROM_BERTH']) 
    elif df3_test.loc[i,'BI'] == 0 & df3_test.iloc[i,21] == df3.iloc[i+1,21]:   
     test_berth2.append(df3_test.loc[i,'FROM_BERTH']) 

    else : 
     test_berth2.append(df3_test.loc[i,'BERTH']) 

test_berth2 

結果:

['29', 'H2', '29', '09', '29', 'J5', 'C5', 'J4', 'J2'] 

循環2:

for i in range(0,6): 
    if df3_test.iloc[i,21] == 0: 
     print (df3_test.loc[i,'BERTH']) 
     while df3_test.iloc[i,21] == 0: 
      print (df3_test.loc[i,'FROM_BERTH']) 
      i = i+1 
    else: 
     print (df3_test.loc[i,'BERTH'],'1') 

結果:

29, H2, 09, J5, 29, 09, J5, 29, J5, C5 1, J4 1, J2 1 

PS:在ILOC列21是 'BI' 順便說一句

+0

在你的第一個「for」循環中,如果/ elif的條件下,確保了&號正在做你想要什麼他們去做。我懷疑你需要布爾(「和」)而不是按位(「&」)運算符。 –

+0

從未嘗試過,謝謝你的建議會給它一個去。希望這會起作用! –

回答

1

我認爲,一個方式,你這樣做是利用熊貓GROUPBY:

df.groupby(df.BI.cumsum())\ 
    .apply(lambda x: [x['BERTH'].iloc[0]]+x['FROM_BERTH'].dropna().tolist())\ 
    .sum() 

輸出:

['29', 'H2', '09', 'J5', 'C5', 'J4', 'J2'] 

注意: cumsum是訣竅。它將允許在BI中創建一個基於零的組,並創建一組等於任何非零值的BI記錄。然後,我們得到BERTH的第一個值和該組中的所有FROM_BERTH值。

在評論編輯的問題:

df.groupby(df.BI.cumsum())\ 
    .apply(lambda x: x['FROM_BERTH'].dropna().tolist()+[x['BERTH'].iloc[0]])\ 
    .sum() 

輸出:

['H2', '09', 'J5', '29', 'C5', 'J4', 'J2'] 
+0

謝謝,儘快嘗試! –

+0

它的工作原理!還有1個問題,我將如何編輯這個結果:['H2','09','J5','29','C5','J4','J2']。那是29後而不是之前。 –

+0

'df.groupby(df.BI.cumsum())\ .apply(lambda x:x ['FROM_BERTH']。dropna()。tolist()+ [x ['BERTH']。iloc [0]] )\ .sum()' –