python - 根据另一个数据帧中的信息填充一个数据帧
问题描述
我有两个大型数据框,但为了方便起见,我只展示了其中的一小部分。一种形式如下(表 1):
| Country | Date | flag | M | notes | V |
|--------------------------------------------------|
| UK | 20210319 | 1 | 3.0 | No Change | C1 |
| UK | 20210320 | 0 | 2.0 | Extension | C2 |
| USA | 20210405 | 0 | 4.0 | New Policy| C1 |
| CAN | 20210405 | 0 | 1.0 | Update | C3 |
另一种形式为(表2):
| Country | Date | C1 | C1_flag | C1_notes |
|-----------------------------------------------|
| UK | 20210319 | NaN | NaN | NaN |
| USA | 20210405 | NaN | NaN | NaN |
| AUS | 20210505 | NaN | NaN | NaN |
| NZ | 20210506 | NaN | NaN | NaN |
在“C1_notes”列之后,还有其他列(C2、C2_flag 和 C2_notes)。实际上,此列结构存在于第一个表的“V”列中的以下代码(C1、C2、C3、C4、C5、E1、E2、H1、H2、H3),但为简洁起见,我只显示表 2 中的 C1。
我希望使用表 1 中的信息填充表 2,以便最终具有以下形式:
| Country | Date | C1 | C1_flag | C1_notes |
|------------------------------------------------|
| UK | 20210319 | 3.0 | 1 | No Change |
| USA | 20210405 | 4.0 | 0 | New Policy|
| AUS | 20210505 | NaN | NaN | NaN |
| NZ | 20210506 | NaN | NaN | NaN |
其中表 2 中的“C1”列使用表 1 的“M”列作为它们的值,同样,“C1_flag”列使用“标志”列。表 2 的填充是基于表 2 中的“国家”和“日期”列与表 1 中的对应项匹配。
我希望“合并”类型的操作可以处理这个问题,但问题是值 (C1...H3) 是表 1 中的列值,但表 2 中的列名。我还认为这是一个Pandas 中的 Pivot/Stack/Melt 类型操作,但事实并非如此,可能需要更通用的映射。我将如何执行这种对应(既适用于 C1,也适用于其他 C、E 和 H 代码)?谢谢。
解决方案
Restructure
第一个数据帧 /manipulate columns
然后update
是具有此重组数据帧的另一个数据帧。
k = df1.pivot(index=['Country','Date'] , columns= ['V'] , values= ['flag','M','notes'])
k.columns = ['_'.join(col[::-1]) if 'M' not in col else col[-1] for col in k.columns]
k = k[sorted(k.columns)]
df2 = df2.set_index(['Country', 'Date'])
df2.update(k)
输出:
C1 C1_flag C1_notes
Country Date
UK 20210319 3.0 1 NoChange
USA 20210405 4.0 0 NewPolicy
AUS 20210505 NaN NaN NaN
NZ 20210506 NaN NaN NaN
完整代码:
from numpy import nan
d1 = {'Country': {0: 'UK', 1: 'UK', 2: 'USA', 3: 'CAN'}, 'Date': {0: 20210319, 1: 20210320, 2: 20210405, 3: 20210405}, 'flag': {0: 1, 1: 0, 2: 0, 3: 0},
'M': {0: 3.0, 1: 2.0, 2: 4.0, 3: 1.0}, 'notes': {0: 'NoChange', 1: 'Extension', 2: 'NewPolicy', 3: 'Update'}, 'V': {0: 'C1', 1: 'C2', 2: 'C1', 3: 'C3'}}
d2 = {'Country': {0: 'UK', 1: 'USA', 2: 'AUS', 3: 'NZ'}, 'Date': {0: 20210319, 1: 20210405, 2: 20210505, 3: 20210506}, 'C1': {
0: nan, 1: nan, 2: nan, 3: nan}, 'C1_flag': {0: nan, 1: nan, 2: nan, 3: nan}, 'C1_notes': {0: nan, 1: nan, 2: nan, 3: nan}}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
k = df1.pivot(index=['Country', 'Date'], columns=[
'V'], values=['flag', 'M', 'notes'])
k.columns = ['_'.join(col[::-1]) if 'M' not in col else col[-1]
for col in k.columns]
k = k[sorted(k.columns)]
df2 = df2.set_index(['Country', 'Date'])
df2.update(k)
推荐阅读
- python - python项目是否有任何依赖文件。像 composer.json 或 package.json?
- php - 无法连接到数据源:库“gds32.dll”加载失败 - Firebird Connection PHP odbc_connect
- node.js - 使用包含过滤器时如何隐藏字段
- excel - 在vba中获取硬盘序列号
- ggplotly - ggplotly 堆积条形图未正确显示
- javascript - 如何在 React 中将 Ref 传递给 SVG 组件
- python - Or-Tools CP-SAT 求解器导出/导入:加载模型后如何访问变量?
- javascript - 如何在 Node 服务器中使用带有 express 的 vue.js 和 ejs 模板引擎?
- java - 如何使用 MyBatis 插入关系表
- reactjs - Ionic React props.match.params 不更新