循环遍历日期并将函数应用于Pandas数据帧。

13 浏览
0 Comments

循环遍历日期并将函数应用于Pandas数据帧。

我试图检测事件发生的第一个日期:在我的数据框中,对于产品A(参见数据透视表),我有20个项目第一次存储在2017-04-03。

因此,我想创建一个名为new_var_2017-04-03的新变量来存储增量。另一方面,在接下来的一天2017-04-04,如果该项目现在是50而不是20,我不介意,我只想存储第一个事件。

它给我多个错误,我想至少知道整个逻辑是否有意义,是否符合"pythonic",或者我完全走错了方向。

raw_data = {'name': ['B','A','A','B'],'date' : pd.to_datetime(pd.Series(['2017-03-30','2017-03-31','2017-04-03','2017-04-04'])),
    'age': [10,20,50,30]}
df1 = pd.DataFrame(raw_data, columns = ['date','name','age'])
table=pd.pivot_table(df1,index=['name'],columns=['date'],values=['age'],aggfunc='sum')
table

我将日期传递给一个列表

dates=df1['date'].values.tolist()

我想在我的列表"dates"中进行一个向后循环,并在事件发生时创建一个变量。

伪代码:通过i-1,我指的是列表中的i之前的项目

def my_fun(x,list):
    for i in reversed(list):
        if (x[i]-x[i-1])>0 :
            x[new_var+i]=x[i]-x[i-1]
    else:
        x[new_var+i]=0
return x  
print (df.apply(lambda x: my_fun(x,dates), axis=1))

期望输出:

raw_data2 = {'new_var': ['new_var_2017-03-30','new_var_2017-03-31','new_var_2017-04-03','new_var_2017-04-04'],'result_a': [np.nan,20,np.nan,np.nan],'result_b': [10,np.nan,np.nan,np.nan]}
df2= pd.DataFrame(raw_data2, columns = ['new_var','result_a','result_b'])
df2.T

0
0 Comments

问题的出现是因为需要对日期进行循环,并且在pandas数据框上应用函数。这个问题的解决方法是使用groupby函数和transform函数来实现。

在给定的代码中,首先使用groupby函数根据'name'列对数据框进行分组。然后,使用transform函数根据每个分组的'age'列计算最小值,并将结果乘以1或0。如果某个值是分组中的最小值,则乘以1,否则乘以0。这样就得到了每个分组中最小值乘以1,其他值乘以0的结果。

另外,还可以使用np.where函数或x.where函数来实现相同的结果。np.where函数在条件为真时返回一个值,否则返回另一个值。x.where函数会将不满足条件的值替换为NaN。

总结起来,以上的代码是通过对日期进行循环,并将函数应用于pandas数据框来实现的。这种方法可以根据需求对数据进行分组并进行相应的计算或替换。

0