首页 > 解决方案 > 有条件地为其他数据框元素创建数据框

问题描述

2020年快乐!我想创建一个基于另外两个的数据框。我有以下两个数据框:

df1 = pd.DataFrame({'date':['03.05.1982','04.05.1982','05.05.1982','06.05.1982','07.05.1982','10.05.1982','11.05.1982'],'A': [63.63,64.08,64.19,65.11,65.36,65.25,65.36], 'B': [63.83, 64.10, 64.19, 65.08, 65.33, 65.28, 65.36], 'C':[63.99, 64.22, 64.30, 65.16, 65.41, 65.36, 65.44]})

df2 = pd.DataFrame({'Name':['A','B','C'],'Notice': ['05.05.1982','07.05.1982','12.05.1982']})

这个想法是创建 df3 使得该数据帧取 A 的值,直到到达 A 的通知日期(在 df2 中找到),然后 df3 切换到 B 的值,直到到达 B 的通知日期,依此类推。当我们在通知日期期间,它应该取当前列和下一个列之间的平均值。

在上面的例子中,df3应该如下(用公式来说明):

df3 = pd.DataFrame({'date':['03.05.1982','04.05.1982','05.05.1982','06.05.1982','07.05.1982','10.05.1982','11.05.1982'], 'Result':[63.63,64.08,(64.19+64.19)/2,65.08,(65.33+65.41)/2,65.36,65.44]})

我的想法是首先创建一个与 df1 具有相同尺寸的临时数据框,并在索引日期在通知之前和 0 之后用 1 填充它。对窗口 1 进行滚动平均值将为每列提供一系列 1,直到达到 0.5(发出开关信号)。 不确定是否有更好的方法来获取 df3?

我尝试了以下方法:

def fill_rule(df_p,df_t):
     return np.where(df_p.index > df_t[df_t.Name==df_p.name]['Notice'][0], 0, 1)

df1['date'] = pd.to_datetime(df1['date'])
df2['notice'] = pd.to_datetime(df2['notice'])
df1.set_index("date", inplace = True)

temp = df1.apply(lambda x: fill_rule(x, df2), axis = 0)

我收到以下错误:KeyError: (0, 'occurred at index B')

标签: pythonpandas

解决方案


df1['t'] = df1['date'].map(df2.set_index(["Notice"])['Name'])
df1['t'] =df1['t'].fillna(method='bfill').fillna("C")

df3 = pd.DataFrame()
df3['Result'] = df1.apply(lambda row: row[row['t']],axis =1)
df3['date'] = df1['date']

推荐阅读