繁体   English   中英

带有列表的熊猫列操作

[英]Pandas Columns Operations with List

我有一个带有两列的pandas数据框,第一列只有一个日期('action_date'),第二列有一个日期列表('verification_date')。 我正在尝试计算'action_date'中的日期和对应的'verification_date'列中列表中的每个日期之间的时间差,然后用Verification_date中的具有不同的日期数填充df新列超过或不足360天。

这是我的代码:

df = pd.DataFrame()
df['action_date'] = ['2017-01-01', '2017-01-01', '2017-01-03']
df['action_date'] = pd.to_datetime(df['action_date'], format="%Y-%m-%d")
df['verification_date'] = ['2016-01-01', '2015-01-08', '2017-01-01']
df['verification_date'] = pd.to_datetime(df['verification_date'], format="%Y-%m-%d")
df['user_name'] = ['abc', 'wdt', 'sdf']
df.index = df.action_date
df = df.groupby(pd.TimeGrouper(freq='2D'))['verification_date'].apply(list).reset_index()


def make_columns(df):
    df = df
    for i in range(len(df)):  
        over_360 = []
        under_360 = []
        for w in [(df['action_date'][i]-x).days for x in df['verification_date'][i]]:
            if w > 360:
                over_360.append(w)
            else:
                under_360.append(w)
        df['over_360'] = len(over_360)
        df['under_360'] = len(under_360)
return df

make_columns(df)

除了df每行具有相同的值外,这种方法还行得通,因为日期不同,因此不正确。 例如,在数据框的第一行中,action_date和verification_date列中列表中的两个项目之间的相差超过360天,因此应将over_360列填充为2。但是,该字段为空而是将under_360列填充为1,该列仅对“ action_date”中的第二行准确。

我有种感觉,我只是弄乱了循环,但确实被卡住了。 感谢您的帮助!

您的问题是,您总是用这些行的最后一次计算的值来更新整个列:

df['over_360'] = len(over_360)
df['under_360'] = len(under_360)

您想要做的是相应地为每条线计算设置值,您可以通过将这些行替换为以下行来实现:

df.set_value(i,'over_360',len(over_360))
df.set_value(i,'under_360',len(under_360))

它的作用是,在第i行和over_360under_360列中设置一个值。

您可以在此处了解更多信息。

如果您不喜欢使用set_values ,也可以使用以下方法:

df.ix[i,'over_360'] = len(over_360)
df.ix[i,'under_360'] = len(under_360)

您可以在此处检查dataframe.ix。

您可能想尝试一下:

df['over_360'] = df.apply(lambda x: sum([((x['action_date'] - i).days >360) for i in x['verification_date']]) , axis=1)
df['under_360'] = df.apply(lambda x: sum([((x['action_date'] - i).days <360) for i in x['verification_date']]) , axis=1)

我相信应该会更快。 您没有指定如果== 360时该怎么做,因此您可以将>或<更改为> =或<=。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM