我有2个数据帧 - " df_rollmax"是" df_data"的衍生物。具有相同的形状。我试图将df_rollmax的值映射回df_data并创建第三个df(df_maxdates),其中包含df_rollmax中每个值最初显示在df_data中的日期。
list1 = [[21,101],[22,110],[25,113],[24,112],[21,109],[28,108],[30,102],[26,106],[25,111],[24,110]]
df_data = pd.DataFrame(list1,index=pd.date_range('2000-1-1',periods=10, freq='D'), columns=list('AB'))
df_rollmax = pd.DataFrame(df_data.rolling(center=False,window=5).max())
mapA = pd.Series(df_data.index, index=df_data['A'])
从上一个问题中,我发现可以找到一个日期:
mapA[rollmax.ix['j','A']]
返回Timestamp('2000-01-07 00:00:00')
但我的真实数据集要大得多,我想用第三个数据框填充日期而不会遍历每一行和每一行。
映射回索引是一个问题,原因是:ValueError: cannot reindex from a duplicate axis
所以这不起作用......
df_maxdates = pd.DataFrame(index=df_data.index, columns=df_data.columns)
for s in df_data.columns:
df_maxdates[s] = mapA.loc[df_rollmax[s]]
使用重复值的最后一个实例可以,但df.duplicated(keep='last')
不合作。
非常感谢任何智慧。
更新 - 这就是df_maxdates的样子:
答案 0 :(得分:1)
您可以使用this BrenBarn's solution:
W = 5 # window size
df = pd.DataFrame(columns=df_data.columns, index=df_data.index[W-1:])
for col in df.columns.tolist():
df[col] = df_data.index[df_data[col].rolling(W)
.apply(np.argmax)[(W-1):]
.astype(int)
+
np.arange(len(df_data)-(W-1))]
df = pd.DataFrame(columns=df_data.columns, index=df_data.index[:W-1]).append(df)
In [226]: df
Out[226]:
A B
2000-01-01 NaT NaT
2000-01-02 NaT NaT
2000-01-03 NaT NaT
2000-01-04 NaT NaT
2000-01-05 2000-01-03 2000-01-03
2000-01-06 2000-01-06 2000-01-03
2000-01-07 2000-01-07 2000-01-03
2000-01-08 2000-01-07 2000-01-04
2000-01-09 2000-01-07 2000-01-09
2000-01-10 2000-01-07 2000-01-09
def idxmax(s, w):
i = 0
while i + w <= len(s):
yield(s.iloc[i:i+w].idxmax())
i += 1
x = pd.DataFrame({'A':[np.nan]*4 + list(idxmax(df_data.A, 5)),
'B':[np.nan]*4 + list(idxmax(df_data.B, 5))},
index=df_data.index)
演示:
In [89]: x = pd.DataFrame({'A':pd.to_datetime([np.nan]*4 + list(idxmax(df_data.A, 5))),
...: 'B':pd.to_datetime([np.nan]*4 + list(idxmax(df_data.B, 5)))},
...: index=df_data.index)
...:
In [90]: x
Out[90]:
A B
2000-01-01 NaT NaT
2000-01-02 NaT NaT
2000-01-03 NaT NaT
2000-01-04 NaT NaT
2000-01-05 2000-01-03 2000-01-03
2000-01-06 2000-01-06 2000-01-03
2000-01-07 2000-01-07 2000-01-03
2000-01-08 2000-01-07 2000-01-04
2000-01-09 2000-01-07 2000-01-09
2000-01-10 2000-01-07 2000-01-09