Pandas-展平从apply loc操作返回的数据帧的对角线值
我有两个数据帧——对于Pandas-展平从apply loc操作返回的数据帧的对角线值,pandas,apply,loc,Pandas,Apply,Loc,我有两个数据帧——对于df中的每一行,我想查找匹配的epoch\u minute-lag并获取相应的average\u hc值 >>> df.head() epoch_minute headcount 0 25640940 8 1 25640939 7 2 25640938 6 3 25640937 10 4 25640936 11 &
df
中的每一行,我想查找匹配的epoch\u minute-lag
并获取相应的average\u hc
值
>>> df.head()
epoch_minute headcount
0 25640940 8
1 25640939 7
2 25640938 6
3 25640937 10
4 25640936 11
>>> avgs.head()
epoch_minute average_hc
0 25640940 7.8
1 25640939 8.5
2 25640938 9.2
3 25640937 10.0
4 25640936 10.1
这个for循环实现了以下功能:
lag = []
for i,r in df.iterrows():
l = avgs.loc[avgs['epoch_minute'] == (r['epoch_minute'] - day), 'average_hc']
lag.append(l) if not l.empty else np.nan
avgs['lag'] = pd.Series(lag).astype('float')
它会产生正确的序列滞后
:
epoch_minute average_hc lag headcount
0 25640940 7.8 30.2 8.0
1 25640939 8.5 28.1 7.0
2 25640938 9.2 26.2 6.0
3 25640937 10.0 24.7 10.0
4 25640936 10.1 23.1 11.0
当我尝试与应用操作相同的逻辑时:
lag1 = df.apply(lambda r: avgs.loc[avgs['epoch_minute'] == (r['epoch_minute'] - day),
'average_hc'], axis=1)
print(f"lag1.shape: {lag1.shape}\nlag1.head():\n{lag1.head()}")
它生成的数据帧值正确,但形状不正确,而不是我预期的系列:
1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 ... 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664
0 30.200001 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN 28.1 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN 26.299999 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN 24.799999 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN 23.1 NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
如何删除NaN或展平由应用返回的数据帧,使其成为一系列对角线值?如果没有匹配的值且返回为空的序列,则使用next
和iter
返回默认值NaN
:
ag1 = df.apply(lambda r: next(iter(avgs.loc[avgs['epoch_minute'] == (r['epoch_minute'] - day),
'average_hc']), np.nan), axis=1)
验证:
day = 1
lag = []
for i,r in df.iterrows():
l = avgs.loc[avgs['epoch_minute'] == (r['epoch_minute'] - day), 'average_hc']
lag.append(l) if not l.empty else np.nan
avgs['lag'] = pd.Series(lag).astype('float')
avgs['lag1'] = df.apply(lambda r: next(iter(avgs.loc[avgs['epoch_minute'] ==
(r['epoch_minute'] - day), 'average_hc']), np.nan),
axis=1)
print (avgs)
epoch_minute average_hc lag lag1
0 25640940 7.8 8.5 8.5
1 25640939 8.5 9.2 9.2
2 25640938 9.2 10.0 10.0
3 25640937 10.0 10.1 10.1
4 25640936 10.1 NaN NaN
另一个解决方案是左连接和左连接,最后一个移位滞后列为:
如果您想将其用作数据帧中的新列,则使用merge
会更容易。
df1 = df[['epoch_minute']]
avgs1 = avgs.rename(columns={'average_hc':'lag1'})
df2 = avgs1.merge(df1, how='left', on='epoch_minute')
df2['lag1'] = df2['lag1'].shift(-day)