首页 > 解决方案 > 熊猫以价值观为中心

问题描述

给定一个数据框

df=pd.DataFrame([[1,11,0],[1,12,1],[2,21,0],[2,22,1]])
df.columns = ['Key','Value','PivotOn']
pivoted = df.pivot(index='Key',columns='PivotOn',values='Value')

枢轴操作将为我提供“PivotOn”列中的第 0 列和第 1 列。但我想始终以值 0、1 和 2 为中心,即使可能不存在 PivotOn = 2 的行(只需为其生成 nan )。

我无法修改原始数据框,所以我想要类似的东西:

pivoted = df.pivot(index='Key',columns=[0,1,2],values='Value')  

它总是会产生 0、1 和 2 的 3 列,并且第 2 列充满了 nan。

标签: pandaspivot

解决方案


假设PivotOn具有三个唯一值0, 1, 2

df=pd.DataFrame([[1,11,0],[1,12,1],[2,21,0],[2,22,2]])
df.columns = ['Key','Value','PivotOn']
df


+---+-----+-------+---------+
|   | Key | Value | PivotOn |
+---+-----+-------+---------+
| 0 |   1 |    11 |       0 |
| 1 |   1 |    12 |       1 |
| 2 |   2 |    21 |       0 |
| 3 |   2 |    22 |       2 |
+---+-----+-------+---------+

并说您需要包括第 2、3 和 4 列(您也可以假设 2 可能存在也可能不存在于 original 中df,因此进行概括)

然后去 -

expected = {2, 3, 4}
res = list(expected - set(df.PivotOn.unique()))
if len(res) > 1:
    new_df = pd.DataFrame({'Key':np.NaN, 'Value':np.NaN, 'PivotOn':res}, index=range(df.shape[0], df.shape[0] + len(res)))
    ndf = pd.concat([df, new_df], sort=False)
    pivoted = ndf.pivot(index='Key',columns='PivotOn',values='Value').dropna(how='all')
else:
    pivoted = df.pivot(index='Key',columns='PivotOn',values='Value')

pivoted


+---------+------+------+------+-----+-----+
| PivotOn |  0   |  1   |  2   |  3  |  4  |
+---------+------+------+------+-----+-----+
| Key     |      |      |      |     |     |
| 1.0     | 11.0 | 12.0 | NaN  | NaN | NaN |
| 2.0     | 21.0 | NaN  | 22.0 | NaN | NaN |
+---------+------+------+------+-----+-----+

推荐阅读