Python 使用列表执行列操作

Python 使用列表执行列操作,python,pandas,Python,Pandas,我有一个包含两列的pandas数据框架,第一列只有一个日期(“action_date”),第二列有一个日期列表(“verification_date”)。我试图计算“action_date”中的日期与相应的“verification_date”列中列表中的每个日期之间的时间差,然后用verification_date中相差超过或低于360天的日期数填充df new列 这是我的密码: df = pd.DataFrame() df['action_date'] = ['2017-01-01', '2

我有一个包含两列的pandas数据框架,第一列只有一个日期(“action_date”),第二列有一个日期列表(“verification_date”)。我试图计算“action_date”中的日期与相应的“verification_date”列中列表中的每个日期之间的时间差,然后用verification_date中相差超过或低于360天的日期数填充df new列

这是我的密码:

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行和第360行或第360行下设置一个值

你可以了解更多

如果您不喜欢使用
设置\u值
,您也可以使用:

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)
df['over_360']=df.apply(λx:sum([((x['action_date']-i).days>360)用于x['verification_date']]中的i),axis=1)

df['under_360']=df.apply(lambda x:sum([((x['action_date']]-i)。您希望将每个action_日期与每个验证_日期进行比较的天数,然后根据这两个日期之间的天数差异填充到_360上和_360下的列中。对吗?非常感谢。这非常有效!!完全有意义。