假设我有以下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
有没有人知道这样做的光滑方式?我发现很多这些熊猫重塑方法都非常钝。
答案 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
以解决此要求。)