python - 非规范化公司名称的 DataFrame [第 2 部分]
问题描述
这是我之前关于非规范化公司名称 DataFrame 的文章的延续。
我现在正在使用的修订表如下:
import numpy as np
import pandas as pd
df = pd.DataFrame({'name' : ['Nitron', 'Pulset', 'Rotaxi'],
'postal_code' : [1410, 1020, 1310],
'previous_name1' : ['Rotory', np.NaN, 'Datec'],
'previous_name2' : [ np.NaN, 'Cmotor', np.NaN],
'previous_name3' : ['Datec', np.NaN, np.NaN],
'country' : ['BEL', 'ENG', 'JPN'],
'city' : ['Brussels', np.NaN, np.NaN]
})
print(df)
| name | postal_code | previous_name1 | previous_name2 | previous_name3 | country | city |
|--------|-------------|----------------|----------------|----------------|---------|----------|
| Nitron | 1410 | Rotory | NaN | Datec | BEL | Brussels |
| Pulset | 1020 | NaN | Cmotor | NaN | ENG | NaN |
| Rotaxi | 1310 | Cyclip | NaN | NaN | JPN | NaN |
与我之前的帖子相比,上面的 DataFrame 现在多了两列,分别是 thecountry
和city
Series。
我的目标保持不变:为所有以前的公司名称与country
andcity
列不丢失的实例添加一个新行,然后删除以前的名称系列。从视觉上看,“非规范化”版本应如下所示:
| name | postal_code | country | city |
|--------|-------------|---------|----------|
| Nitron | 1410 | BEL | Brussels |
| Rotory | 1410 | BEL | Brussels |
| Datec | 1410 | BEL | Brussels |
| Pulset | 1020 | ENG | NaN |
| Cmotor | 1020 | ENG | NaN |
| Rotaxi | 1310 | JPN | NaN |
| Cyclip | 1310 | JPN | NaN |
在花了一些时间了解jezrael为我之前的问题提供的代码之后,我尝试修改/调整这个新问题的解决方案,但没有成功。由于我对 Python/Pandas 生态系统相当陌生,因此将不胜感激任何额外的帮助。
解决方案
您可以添加多个列set_index
并更改level=1
为level=3
删除第四级MultiIndex
:
df1 = (df.set_index(['postal_code','country','city'])
.stack()
.reset_index(level=3, drop=True)
.reset_index(name='name')
)
print (df1)
postal_code country city name
0 1410 BEL Brussels Nitron
1 1410 BEL Brussels Rotory
2 1410 BEL Brussels Datec
3 1020 ENG NaN Pulset
4 1020 ENG NaN Cmotor
5 1310 JPN NaN Rotaxi
6 1310 JPN NaN Datec
对于第二种解决方案,将多列添加到melt
:
df1 = (df.melt(['postal_code','country','city'], value_name='name')
.drop('variable', axis=1)
.dropna(subset=['name'])
.reset_index( drop=True)
)
print (df1)
postal_code country city name
0 1410 BEL Brussels Nitron
1 1020 ENG NaN Pulset
2 1310 JPN NaN Rotaxi
3 1410 BEL Brussels Rotory
4 1310 JPN NaN Datec
5 1020 ENG NaN Cmotor
6 1410 BEL Brussels Datec
推荐阅读
- html - jquery Uncaught SyntaxError:无效或意外的令牌 - 错误
- regex - 正则表达式从最后一个中提取单词
- python - 基于键的字典交集,TypeError:列表索引必须是整数或切片,而不是索引
- flutter - Flutter 显示 JSON 数组中的值并点击更改索引
- selenium - Azure devops 硒测试计划
- java - 如何在运行时从父类访问子类变量?
- python-3.x - pyqt5 主窗口关闭事件 - 重新检查用户是否要关闭窗口
- php - Aws Cognito php 客户端 getUser 始终为空
- azure - 通过 Azure AD B2C 中的 MS Graph API 以编程方式将“本地”IdentityProvider 切换为用户名
- flutter - 颤动TextField粘性,当我完成其他项目时光标跳回它