Pandas 数据框,根据行值创建列

数据挖掘 熊猫 python-3.x
2021-10-12 05:49:42

我得到一个 csv,如果你阅读它,它看起来像:

import pandas as pd
df = pd.DataFrame([['de,ch,fr', '1,2,3'],['fr,ch,dk', '3,4,5']], columns=['countries', 'numbers'], index=['abc', 'bcd'])

我想让它看起来像这样:

df = pd.DataFrame([[1,2,3,0], [0,4,3,5]], columns=['de_number', 'ch_number', 'fr_number', 'dk_number'], index=['abc', 'bcd'])

这意味着爆炸国家列并为索引中的每个值获取单独列中每个国家的数字。我事先有此数据框的所有国家/地区的列表(这意味着我事先知道我将拥有值 ['de', 'ch', 'fr', 'dk'])

有没有一种干净的方法?进入我脑海的一切都很混乱。

1个回答

首先,我们使用DataFrame.explode将您的列表取消嵌套到行。

然后我们使用DataFrame.pivot_table将您的数据框从行旋转到列以获得您想要的结果:

dfn = df.assign(countries=df['countries'].str.split(',')).explode('countries')
dfn['numbers'] = df.assign(numbers=df['numbers'].str.split(',')).explode('numbers')['numbers']

dfn = (
    dfn.pivot_table(index=dfn.index, 
                    columns='countries', 
                    values='numbers', 
                    aggfunc=lambda x: x, 
                    fill_value=0)
       .rename_axis(None, axis='columns')
       .add_suffix('_number')
)

输出

    ch_number de_number dk_number fr_number
abc         2         1         0         3
bcd         4         0         5         3