2017-08-16 279 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()' –