使用重复列索引重塑Pandas DataFrame

时间:2015-03-11 19:28:52

标签: python pandas dataframe reshape

假设我有以下DataFrame:

>>> cols = ['model', 'parameter', 'condition', 'value']
>>> df = pd.DataFrame([['BMW', '0-60', 'rain', '7'], ['BMW', '0-60', 'sun', '7'],
                   ['BMW','mpg', 'rain','25'], 
                   ['BMW', 'stars', 'rain','5'],
                   ['Toyota', '0-60', 'rain','9'], 
                   ['Toyota','mpg', 'rain','40'], 
                   ['Toyota', 'stars', 'rain','4']], columns=cols)

>>> df
    model parameter condition value
0     BMW      0-60      rain     7
1     BMW      0-60       sun     7
2     BMW       mpg      rain    25
3     BMW     stars      rain     5
4  Toyota      0-60      rain     9
5  Toyota       mpg      rain    40
6  Toyota     stars      rain     4

这是不同条件下各种汽车的性能指标列表。当然,这是一个弥补的数据集,但它代表了我的问题。

我最终想要的是在自己的行上观察给定条件,并在其自己的列上观察每个度量。这看起来像这样:

    parameter  condition  0-60   mpg    stars
     model        
0     BMW       rain       7      25     5
1     BMW       sun        7      NaN    NaN
2     Toyota    rain       9      40     4

请注意,我刚刚编写了上面的格式。我不知道熊猫会不会产生类似的东西,但这是一般的想法。我当然也会将“条件”转换为布尔数组并填充NaN。

我的问题是,当我尝试使用pivot方法时,我收到错误。我认为这是因为我的“专栏”键重复出现(因为我有0-60级的降雨和太阳条件的数据)。

df.pivot(index='model',columns='parameter')
ValueError: Index contains duplicate entries, cannot reshape

有没有人知道这样做的光滑方式?我发现很多这些熊猫重塑方法都非常钝。

2 个答案:

答案 0 :(得分:1)

您只需更改索引并将其取消堆叠......

df.set_index(['model', 'condition', 'parameter']).unstack()

返回

                 value           
parameter         0-60  mpg stars
model  condition                 
BMW    rain          7   25     5
       sun           7  NaN   NaN
Toyota rain          9   40     4

答案 1 :(得分:0)

您可以使用pivot_table获取所需的结果并传递以下参数:

>>> df.pivot_table(index=['model', 'condition'], values='value', columns='parameter')
parameter         0-60  mpg  stars
model  condition                  
BMW    rain          7   25      5
       sun           7  NaN    NaN
Toyota rain          9   40      4

(您可能需要先确保“value”列包含数字类型,否则您可以在aggfunc=lambda x: x函数中传递pivot_table以解决此要求。)