条件在循环
使用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' 顺便说一句
我认为,一个方式,你这样做是利用熊猫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']
谢谢,尽快尝试! –
它的工作原理!还有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()' –
在你的第一个“for”循环中,如果/ elif的条件下,确保了&号正在做你想要什么他们去做。我怀疑你需要布尔(“和”)而不是按位(“&”)运算符。 –
从未尝试过,谢谢你的建议会给它一个去。希望这会起作用! –