为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas - 根据特定列的值在 DataFrame 中创建单独的列

Pandas - 根据特定列的值在 DataFrame 中创建单独的列

牛魔王的故事 2021-06-06 08:27:02
假设我有一个简单的 Pandas DataFrame,其中一列包含国家/地区名称,另一列包含一些值。例如:# Import Python Librariesimport numpy as npimport pandas as pd# Create Sample DataFramedf = pd.DataFrame(data={'Country': ['United States','United States','United States','United States', \                     'United States','United States','United States','United States', \                     'United States','United States','United States','United States', \                     'Canada','Canada','Canada','Canada','Canada','Canada','Mexico', \                     'Mexico','Mexico','Mexico','England','England','England','England', \                     'England','England','England','England','England','England','England', \                     'England','England','England','France','France','France','Spain','Germany', \                     'Germany','Germany','Germany','Germany','Germany','Germany','Germany', \                     'Germany','Germany'], 'Value': np.random.randint(1000, size=50)})产生:print(df.head())Index     Country     Value  0    United States   943  1    United States   567  2    United States   534  3    United States   700  4    United States   470我的问题是,在 Python 中将此 DataFrame 转换为每个国家/地区都有自己的列并且该国家/地区的所有值都列在该列中的最简单方法是什么?换句话说,我如何轻松创建一个 DataFrame,其中列数是“Country”列中国家的唯一计数,并且每列的长度将根据相应国家/地区在原始 DataFrame 中出现的次数而有所不同?以下是提供解决方案的示例代码:# Store Unique Country Names in Variablecolumns = df['Country'].unique()# Create Individual Country DataFramesdf_0 = df[df['Country'] == columns[0]]['Value'].values.tolist()df_1 = df[df['Country'] == columns[1]]['Value'].values.tolist()df_2 = df[df['Country'] == columns[2]]['Value'].values.tolist()df_3 = df[df['Country'] == columns[3]]['Value'].values.tolist()df_4 = df[df['Country'] == columns[4]]['Value'].values.tolist()df_5 = df[df['Country'] == columns[5]]['Value'].values.tolist()df_6 = df[df['Country'] == columns[6]]['Value'].values.tolist()虽然上面的代码有效,但对于较大的数据集,它显然不是一个站得住脚的解决方案。从原始 DataFrame 生成此结果的最有效方法是什么?
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

使用groupby,cumcount以及unstack用T:


df.set_index(['Country',df.groupby('Country').cumcount()])['Value'].unstack().T

输出:


Country  Canada  England  France  Germany  Mexico  Spain  United States

0         535.0    666.0   545.0    522.0   581.0  525.0          394.0

1         917.0    130.0    76.0    882.0   563.0    NaN          936.0

2         344.0    376.0   960.0    442.0   247.0    NaN          819.0

3         760.0    272.0     NaN    604.0   976.0    NaN          975.0

4         745.0    199.0     NaN    512.0     NaN    NaN          123.0

5         654.0    102.0     NaN    114.0     NaN    NaN          690.0

6           NaN    570.0     NaN    318.0     NaN    NaN          568.0

7           NaN    807.0     NaN    523.0     NaN    NaN          385.0

8           NaN     18.0     NaN    890.0     NaN    NaN          451.0

9           NaN     26.0     NaN    635.0     NaN    NaN          282.0

10          NaN    871.0     NaN      NaN     NaN    NaN          771.0

11          NaN    122.0     NaN      NaN     NaN    NaN          505.0

12          NaN      0.0     NaN      NaN     NaN    NaN            NaN

13          NaN    578.0     NaN      NaN     NaN    NaN            NaN


查看完整回答
反对 回复 2021-06-09
?
慕森王

TA贡献1777条经验 获得超3个赞

pd.pivot 带你到一半,这里的问题是你的索引没有信息所以你的非 NaN 值不在 df 的顶部


df.pivot(index=None, columns='Country', values = 'Value')


Country  Canada  England  France      ...        Mexico  Spain  United States

0           NaN      NaN     NaN      ...           NaN    NaN          992.0

1           NaN      NaN     NaN      ...           NaN    NaN          814.0

2           NaN      NaN     NaN      ...           NaN    NaN          489.0

3           NaN      NaN     NaN      ...           NaN    NaN          943.0

4           NaN      NaN     NaN      ...           NaN    NaN          574.0

5           NaN      NaN     NaN      ...           NaN    NaN          428.0

6           NaN      NaN     NaN      ...           NaN    NaN          907.0

7           NaN      NaN     NaN      ...           NaN    NaN          899.0

8           NaN      NaN     NaN      ...           NaN    NaN          379.0

9           NaN      NaN     NaN      ...           NaN    NaN          130.0


查看完整回答
反对 回复 2021-06-09
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信