for循环中的条件

2024-05-13 13:38:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在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\u 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'btw


Tags: 数据fromtesth2locbij5append
1条回答
网友
1楼 · 发布于 2024-05-13 13:38:56

我认为,一种方法是使用熊猫群比:

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得到第一个值,并从该组中得到所有的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']

相关问题 更多 >