我有一个公司名称的Pandas DataFrame,其结构如下:
RewriteEngine On
# Custom Rule START #
RedirectMatch 301 ^/artists/artists/(.*)$ /artists/$1
# Custom Rule END #
您会注意到,一家公司最多可以使用三个以前的名字。
我的目标是对上表进行“非规范化”,以便新的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]
})
print(df)
| name | postal_code | previous_name1 | previous_name2 | previous_name3 |
|--------|-------------|----------------|----------------|----------------|
| Nitron | 1410 | Rotory | NaN | Datec |
| Pulset | 1020 | NaN | Cmotor | NaN |
| Rotaxi | 1310 | Cyclip | NaN | NaN |
也就是说,我要为所有没有丢失公司名称的实例添加一个新行,然后删除系列名称(之后我还要为每个新行添加| name | postal_code |
|--------|-------------|
| Nitron | 1410 |
| Rotory | 1410 |
| Datec | 1410 |
| Pulset | 1020 |
| Cmotor | 1020 |
| Rotaxi | 1310 |
| Cyclip | 1310 |
值)
我正在寻找方法的描述(最好使用代码或伪代码),这将使我获得上述结果。
答案 0 :(得分:3)
将DataFrame.set_index
与DataFrame.stack
一起使用以除去错误的值并整形,然后通过DataFrame.reset_index
除去MultiIndex
的第二级,最后将Series
转换为两列{ {1}}:
DataFrame
或将DataFrame.melt
与DataFrame.dropna
一起使用,但是值的顺序不同:
df1 = (df.set_index('postal_code')
.stack()
.reset_index(level=1, drop=True)
.reset_index(name='name'))
print (df1)
postal_code name
0 1410 Nitron
1 1410 Rotory
2 1410 Datec
3 1020 Pulset
4 1020 Cmotor
5 1310 Rotaxi
6 1310 Datec
但可以按第一列排序:
df1 = (df.melt('postal_code', value_name='name')
.drop('variable', axis=1)
.dropna(subset=['name'])
.reset_index( drop=True)
)
print (df1)
postal_code name
0 1410 Nitron
1 1020 Pulset
2 1310 Rotaxi
3 1410 Rotory
4 1310 Datec
5 1020 Cmotor
6 1410 Datec