对公司名称的数据框架进行非规范化[第1部分]

时间:2019-07-07 13:58:52

标签: python pandas dataframe

我有一个公司名称的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 | 值)

我正在寻找方法的描述(最好使用代码或伪代码),这将使我获得上述结果。

1 个答案:

答案 0 :(得分:3)

DataFrame.set_indexDataFrame.stack一起使用以除去错误的值并整形,然后通过DataFrame.reset_index除去MultiIndex的第二级,最后将Series转换为两列{ {1}}:

DataFrame

或将DataFrame.meltDataFrame.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