熊猫立足价值

时间:2019-01-05 05:03:34

标签: pandas pivot

给出一个数据框

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')  

,它将始终产生3列0、1和2列,而第2列填充有nans。

2 个答案:

答案 0 :(得分:1)

假设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列(您还可以假设原始df中可能存在或不存在2,因此进行了概括)

然后按-

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 |
+---------+------+------+------+-----+-----+

答案 1 :(得分:1)

如果您只需要在数据框中不存在nan的'2'列,则可以尝试此操作

def no_col_2(df):
    if 2 not in df['PivotOn']:
        pivoted = df.pivot(index='Key',columns='PivotOn',values='Value') 
        pivoted['2'] = np.nan
    else:
        pivoted = df.pivot(index='Key',columns='PivotOn',values='Value') 

no_col_2(df) 

print(pivoted)

PivotOn   0   1   2
Key                
1        11  12 NaN
2        21  22 NaN