猿问

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

假设我有一个简单的 Pandas DataFrame,其中一列包含国家/地区名称,另一列包含一些值。例如:


# Import Python Libraries

import numpy as np

import pandas as pd


# Create Sample DataFrame

df = 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 Variable

columns = df['Country'].unique()


# Create Individual Country DataFrames

df_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 生成此结果的最有效方法是什么?



牛魔王的故事
浏览 208回答 3
3回答

翻过高山走不出你

使用groupby,cumcount以及unstack用T:df.set_index(['Country',df.groupby('Country').cumcount()])['Value'].unstack().T输出:Country  Canada  England  France  Germany  Mexico  Spain  United States0         535.0    666.0   545.0    522.0   581.0  525.0          394.01         917.0    130.0    76.0    882.0   563.0    NaN          936.02         344.0    376.0   960.0    442.0   247.0    NaN          819.03         760.0    272.0     NaN    604.0   976.0    NaN          975.04         745.0    199.0     NaN    512.0     NaN    NaN          123.05         654.0    102.0     NaN    114.0     NaN    NaN          690.06           NaN    570.0     NaN    318.0     NaN    NaN          568.07           NaN    807.0     NaN    523.0     NaN    NaN          385.08           NaN     18.0     NaN    890.0     NaN    NaN          451.09           NaN     26.0     NaN    635.0     NaN    NaN          282.010          NaN    871.0     NaN      NaN     NaN    NaN          771.011          NaN    122.0     NaN      NaN     NaN    NaN          505.012          NaN      0.0     NaN      NaN     NaN    NaN            NaN13          NaN    578.0     NaN      NaN     NaN    NaN            NaN

慕森王

pd.pivot 带你到一半,这里的问题是你的索引没有信息所以你的非 NaN 值不在 df 的顶部df.pivot(index=None, columns='Country', values = 'Value')Country  Canada  England  France      ...        Mexico  Spain  United States0           NaN      NaN     NaN      ...           NaN    NaN          992.01           NaN      NaN     NaN      ...           NaN    NaN          814.02           NaN      NaN     NaN      ...           NaN    NaN          489.03           NaN      NaN     NaN      ...           NaN    NaN          943.04           NaN      NaN     NaN      ...           NaN    NaN          574.05           NaN      NaN     NaN      ...           NaN    NaN          428.06           NaN      NaN     NaN      ...           NaN    NaN          907.07           NaN      NaN     NaN      ...           NaN    NaN          899.08           NaN      NaN     NaN      ...           NaN    NaN          379.09           NaN      NaN     NaN      ...           NaN    NaN          130.0
随时随地看视频慕课网APP

相关分类

Python
我要回答