Python 使用列表执行列操作
我有一个包含两列的pandas数据框架,第一列只有一个日期(“action_date”),第二列有一个日期列表(“verification_date”)。我试图计算“action_date”中的日期与相应的“verification_date”列中列表中的每个日期之间的时间差,然后用verification_date中相差超过或低于360天的日期数填充df new列 这是我的密码: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
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下的列中。对吗?非常感谢。这非常有效!!完全有意义。