python - Pandas 从 n 个数据帧中提取数据并将其合并到一个数据帧中
问题描述
我已经查找了关于该主题的另一个类似的问答,但我无法弄清楚我的问题,所以我很感激任何提示。当我想收集数据时,我在字典中存储了三个数据帧和另一个数据帧。
import numpy as np
import pandas as pd
df1= pd.DataFrame({'tenor':['1w', '1m', '3m', '2y'],
'rate':[2.40, 2.51, 2.66, 2.92],
'end_date':['14022020', '09022020', '07052020', '07022022']})
df2= pd.DataFrame({'tenor':['3x6', '6x9', '9x12'],
'rate':[2.95, 3.06, 3.98],
'end_date':['07082020', '09112020', '08022021']})
df3= pd.DataFrame({'tenor':['2y', '3y', '4y'],
'rate':[1.80, 1.81, 1.84],
'end_date':['08022022', '07022023', '07022024']})
rates = {'ois':df1, 'fra':df2, 'irs':df3}
dfA= pd.DataFrame({'label':['ois', 'ois', 'fra', 'fra', 'irs', 'irs', 'irs'],
'tenor':['1w', '1m', '3x6', '9x12', '2y', '3y', '4y']})
我想通过从匹配 ['tenor'] 的对应数据帧(通过字典映射)中提取值来在 dfA 中添加另一个列 ['rates']。所以预期的结果是这样的:
Out[]:
label tenor rate
0 ois 1w 2.40
1 ois 1m 2.51
2 fra 3x6 2.95
3 fra 9x12 3.98
4 irs 2y 1.80
5 irs 3y 1.81
6 irs 4y 1.84
我知道我可以使用这一行(例如)在数据框中获取特定数据:
rates['ois'].loc[rates['ois']['tenor']=='1w', 'rate']
Out[]:
0 2.4
Name: rate, dtype: float64
所以我尝试使用以下代码将其嵌入到 apply() 函数中:
dfA['rate'] = dfA.apply(lambda x: rates[x['label']][rates[x['label']]['tenor']==x['tenor']]['rate'], axis=1)
但不幸的是它返回:
Out[]:
label tenor rate
0 ois 1w 2.40
1 ois 1m NaN
2 fra 3x6 2.95
3 fra 9x12 NaN
4 irs 2y 1.80
5 irs 3y NaN
6 irs 4y NaN
我不明白为什么有些费率是 NaN。我在这里想念什么?请帮忙。
解决方案
我不知道这对你来说是否是一个有说服力的解决方案,但我会这样做:
在另一个 DataFrame 中连接 dfs:
dfAux = pd.concat([df1, df2, df3])
使用左侧的 dfA 进行合并:
dfA = pd.merge(dfA, dfAux, how = 'left', on = ['tenor']).drop(['end_date'], axis = 1)
推荐阅读
- prolog - 获得“独特”绑定的更简单方法?
- c# - 在运行时从 txt 文件更新文本框而不单击“刷新”
- python-3.x - 如果我在 pyplot 之前导入熊猫,则 ModuleNotFoundError
- flutter - Flutter:移动到下一个屏幕时,CupertinoTabBar 不会消失
- java - 从经过身份验证的服务器下载带有 java 的大文件
- swift - 以编程方式创建自定义 UICollectionFlowLayout
- java - JSoup 匹配带有空格的精确文本
- ios - Swift - 过渡导航栏
- c - 将结构中的结构传递给 pthread_create
- python - Django中的更新功能视图不保存编辑