将数据框列值提取为独立列

时间:2018-01-09 20:05:31

标签: python pandas dataframe pivot pivot-table

我的pandas数据框定义如下:

df = pd.DataFrame({'Country': ['US', 'US', 'CA', 'CA', 'BE', 'BE', 'BE', 'MX'], 
                   'Language': ['en', 'es', 'en', 'fr', 'nl', 'fr', 'de', 'es']})

我想转动/转换此数据框,以便语言列下的值构成单独的列,例如

这种最干净,最熊猫的方式是什么?

2 个答案:

答案 0 :(得分:2)

我会分配一个新列并根据该列执行一个数据透视:

df.assign(
    lang_id='Lang' + df.groupby('Country').cumcount().add(1).astype('str')
    ).pivot(index='Country', columns='lang_id', values='Language').reset_index()

lang_id Country Lang1 Lang2 Lang3
0            BE    nl    fr    de
1            CA    en    fr  None
2            MX    es  None  None
3            US    en    es  None

另一种选择是:

df.groupby('Country')['Language'].apply(list).apply(pd.Series).reset_index()
Out: 
  Country   0    1    2
0      BE  nl   fr   de
1      CA  en   fr  NaN
2      MX  es  NaN  NaN
3      US  en   es  NaN

对于两者,您可以在末尾调用fillna('')以使用空字符串填充NaN。

答案 1 :(得分:1)

您也可以试试这个。

df = pd.DataFrame({'Country': ['US', 'US', 'CA', 'CA', 'BE', 'BE', 'BE', 'MX'], 
               'Language': ['en', 'es', 'en', 'fr', 'nl', 'fr', 'de', 'es']})

首先使用groupbyunique()找到每个国家/地区的唯一语言。

df2 = pd.DataFrame(df.groupby(["Country"])["Language"].unique().reset_index())

# df2
#   Country     Language
# 0     BE     [nl, fr, de]
# 1     CA     [en, fr]
# 2     MX     [es]
# 3     US     [en, es]

# Then split Language column into 3 columns
langs = df2.Language.values.tolist()).add_prefix('Lang')

# concat two df to get the desired output
pd.concat([df2.Country, langs], axis=1)

      Country  Lang0    Lang1   Lang2
  0     BE      nl      fr      de
  1     CA      en      fr      None
  2     MX      es      None    None
  3     US      en      es      None