【问题标题】:Conditions in for loopfor循环中的条件
【发布时间】:2018-01-24 18:24:32
【问题描述】:

在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' 顺便说一句

【问题讨论】:

  • 在你的第一个“for”循环中,在 if/elif 条件中,确保 & 符正在执行您希望它们执行的操作。我怀疑您需要布尔(“and”)而不是按位(“&”)运算符。
  • 从未尝试过,感谢您的建议,将试一试。希望这会奏效!

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


【解决方案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']

【讨论】:

  • 谢谢,尽快试用!
  • 有效!还有 1 个问题,我将如何编辑它以使其具有结果:['H2','09','J5','29','C5','J4','J2']。即有 29 之后而不是之前。
  • df.groupby(df.BI.cumsum())\ .apply(lambda x: x['FROM_BERTH'].dropna().tolist()+[x['BERTH'].iloc[0]])\ .sum()
  • @AasheetKumar 很高兴这有效。请参阅解决方案中的编辑以在此处解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2016-04-10
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2018-06-26
相关资源
最近更新 更多