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