【问题标题】:How to iterate rows in pandas dataframe如何迭代熊猫数据框中的行
【发布时间】:2017-07-18 11:54:02
【问题描述】:

我有以下代码

import pandas as pd
import numpy as np
import csv


location = r'C:\Users\tmaina\Desktop\scf\output.csv'
df = pd.read_csv(location,sep='\s*,\s*',engine='python')
for i, row in df.iterrows():
    if row['COUPON_NUMBER'] == 1:
        df.OND_ORIGIN = df.DEP_FROM 
        if  df.loc[i+1,'PLDATE'] == row['PLDATE'] & row['TICKET_NUMBER'] ==df.loc[i+1,'TICKET_NUMBER'] &row['COUPON_NUMBER'] == 2:
            df.OND_DEST = df.loc[i+1,'ARR_TO']
        else:
            df.OND_DEST = df.ARR_TO
    elif row['COUPON_NUMBER'] == 2 & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER'] & row['PLDATE'] ==df.loc[i-1,'PLDATE']:
        df.OND_ORIGIN==df.loc[i-1,'DEP_FROM']
        df.OND_DEST = df.ARR_TO
    elif row['COUPON_NUMBER'] == 3 & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER'] & row['PLDATE'] !=df.loc[i-1,'PLDATE']:
        df.OND_ORIGIN = df.DEP_FROM
        if  df.loc[i+1,'PLDATE'] == row['PLDATE'] & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER']:
            df.OND_DEST = df.loc[i+1,'ARR_TO']
        else:
            df.OND_DEST = df.ARR_TO
    elif row['COUPON_NUMBER'] == 4 & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER']& row['PLDATE'] ==df.loc[i-1,'PLDATE']:
        df.OND_ORIGIN = df.loc[i-1,'DEP_FROM']
        df.OND_DEST = df.ARR_TO

df.to_csv('out.csv', sep=',',index = False)

以下列的输出是

COUPON_NUMBER TICKET_NUMBER DEP_FROM    ARR_TO  OND_ORIGIN  OND_DEST  PLDATE   STOPOVER
    1          1054737998    HRE             NBO    HRE     NBO       20170419  O
    2          1054737998    NBO             KGL    NBO     KGL       20170419  X   
    3          1054737998    KGL             NBO    KGL     NBO       20170519  O   
    4          1054737998    NBO             HRE    NBO     HRE       20170419  X

想要的输出是

COUPON_NUMBER TICKET_NUMBER DEP_FROM    ARR_TO  OND_ORIGIN  OND_DEST  PLDATE   STOPOVER
    1          1054737998    HRE         NBO    HRE         KGL       20170419  O
    2          1054737998    NBO         KGL    HRE         KGL       20170419  X   
    3          1054737998    KGL         NBO    KGL         HRE       20170519  O   
    4          1054737998    NBO         HRE    KGL         HRE       20170419  X

逻辑是,对于属于特定机票的给定coupon_number,我们检查pldate,如果同一月有多个优惠券,ond_originond_dest 应该相等。 ond_dest 是通过检查是否在特定城市停留来确定的。如果有,arr_to 会变成ond_destond_origin 会变成第一个dep_from,不会停下来。

【问题讨论】:

标签: python pandas dataframe data-science


【解决方案1】:

您可以使用groupbyGroupertransform 来执行此操作,而不是遍历每一行。要获取每个组的第一个和最后一个,您可以使用this

如果PLDATE 是一个日期时间列,你可以这样做

df['OND_ORIGIN'] = df.groupby(['TICKET_NUMBER', pd.Grouper(key='PLDATE', freq='1M')])['DEP_FROM'].transform(first)   
df['OND_DEST'] = df.groupby(['TICKET_NUMBER', pd.Grouper(key='PLDATE', freq='1M')])['ARR_TO'].transform(last)

Grouper 仅在您想每月分组时才需要。如果是按日期,你可以做df.groupby(['TICKET_NUMBER', 'PLDATE', freq='1M'])

【讨论】:

  • PLDATE 不是 datetime 列,日期转换为 int
  • 将日期或 id 表示为整数可能会导致奇怪的效果,尤其是在涉及 NaN 或前导零时,因此最好避免这种情况。在这种情况下,可以由df['PLDATE'] = pd.to_datetime(df['PLDATE'].astype(str), format='%Y%m%d) 完成
  • 注意,感谢您的建议,我已经实现了上述内容,但是由于尚未定义“first”,因此出现名称错误。
  • first。另一种方法是 lambda x: x[0]lambda x: x.first()(最后一项是 x[-1])作为聚合函数
猜你喜欢
  • 2020-05-17
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2021-07-20
  • 2019-11-29
  • 2019-03-15
相关资源
最近更新 更多