我的pandas数据框定义如下:
df = pd.DataFrame({'Country': ['US', 'US', 'CA', 'CA', 'BE', 'BE', 'BE', 'MX'],
'Language': ['en', 'es', 'en', 'fr', 'nl', 'fr', 'de', 'es']})
我想转动/转换此数据框,以便语言列下的值构成单独的列,例如
这种最干净,最熊猫的方式是什么?
答案 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']})
首先使用groupby
和unique()
找到每个国家/地区的唯一语言。
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