for循环的条件

时间:2017-08-16 14:33:46

标签: python loops pandas for-loop while-loop

在python中使用pandas数据框:

我试图从数据框中获取以下数据,但无法修复我的循环以获得正确的结果。

数据集的一小部分样本:

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:第21栏的iloc是' BI'顺便说一句

1 个答案:

答案 0 :(得分:1)

我认为,你这样做的一种方法是使用Pandas 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创建一组1个等于非零的记录。然后,我们从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']