这是我的previous post关于公司名称数据帧非规范化的继续。你知道吗
一些背景:
最初,我使用下表:
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 |
反规范化的目标是为以前的公司名称不丢失的所有实例添加新行,然后删除以前的所有名称序列。你知道吗
多亏了jezrael,我用以下代码实现了这一点:
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
新目标
我的新目标是添加一个附加的标志/列,其值定义为
也就是说,新的DataFrame在视觉上应该是这样的(列的顺序无关紧要):
| name | postal_code | country | city | old_name_flag |
|--------|:-----------:|:-------:|----------|:-------------:|
| Nitron | 1410 | BEL | Brussels | 0 |
| Rotory | 1410 | BEL | Brussels | 1 |
| Datec | 1410 | BEL | Brussels | 1 |
| Pulset | 1020 | ENG | NaN | 0 |
| Cmotor | 1020 | ENG | NaN | 1 |
| Rotaxi | 1310 | JPN | NaN | 0 |
| Cyclip | 1310 | JPN | NaN | 1 |
我试图调整耶斯雷尔的代码,但没有成功。任何额外的帮助都将不胜感激。你知道吗
这里有一种使用
wide_to_long
的方法或者我们从你的df1开始
重新索引时,信息已在数据帧中:
输出:
更新:您还可以按如下方式使用
assign
链接命令(不过为了清晰起见,我更喜欢使用单独的命令):相关问题 更多 >
编程相关推荐