防止NaN成为数据框枢纽中的索引和列

时间:2018-11-14 12:27:01

标签: python pandas dataframe pivot

我有一个数据框,我将其扩展为包括2列中所有增量的值。因此,按预期和期望引入了NaN值。

但是,当我在此数据框上使用数据透视时,将获得NaN的行和列。 做支点时可以防止这种情况吗?如果没有,如何删除名为NaN的列? 尝试通过调用[NaN],[nan]或['NaN']删除它不起作用。

在这种情况下,将所有值均为NaN的列和行删除将不起作用,因为列标题和索引用于海洋热图图,因此即使所有单元格值均为NaN,将其用作索引仍然有用并且键值不是NaN

示例代码;

import pandas as pd
import numpy as np

#generate dummy data
df = pd.DataFrame({'Y': np.random.randint(130,140,10),
                   'X': np.random.randint(5,10,10),
                   'Z': np.random.randint(0,25, size=10)})
df = df.round(1)
#create dataset for heatmap
#group by axis to plot
df = df.groupby(['X','Y']).sum().reset_index()
df = df.sort_values(by=['Y'])
dfY = pd.DataFrame({'Y':np.arange(min(df['Y']), max(df['Y']),1)})
dfX = pd.DataFrame({'X':np.arange(min(df['X']), max(df['X']),1)})
df = pd.merge(df,dfY, how='outer', on='Y')
df = pd.merge(df,dfX, how='outer', on='X')
df = df.round(1)

print(df)
#restructure for heatmap
data = df.pivot("Y","X","Z").sort_values(by=['Y'],ascending=False)
print(data)

在透视之前采样DataFrame:

      X      Y     Z
0   5.0  132.0   0.0
1   5.0  135.0  20.0
2   5.0  137.0  17.0
3   7.0  132.0  15.0
4   7.0  133.0   3.0
5   6.0  133.0  30.0
6   6.0  135.0  22.0
7   6.0  138.0  16.0
8   9.0  135.0   9.0
9   NaN  134.0   NaN
10  NaN  136.0   NaN
11  8.0    NaN   NaN

枢轴之后:

X       NaN    5.0   6.0   7.0   8.0   9.0
Y                                         
 138.0   NaN   NaN  16.0   NaN   NaN   NaN
 137.0   NaN  17.0   NaN   NaN   NaN   NaN
 136.0   NaN   NaN   NaN   NaN   NaN   NaN
 135.0   NaN  20.0  22.0   NaN   NaN   9.0
 134.0   NaN   NaN   NaN   NaN   NaN   NaN
 133.0   NaN   NaN  30.0   3.0   NaN   NaN
 132.0   NaN   0.0   NaN  15.0   NaN   NaN
NaN      NaN   NaN   NaN   NaN   NaN   NaN

所需的输出:

X        5.0   6.0   7.0   8.0   9.0
Y                                         
 138.0   NaN  16.0   NaN   NaN   NaN
 137.0  17.0   NaN   NaN   NaN   NaN
 136.0   NaN   NaN   NaN   NaN   NaN
 135.0  20.0  22.0   NaN   NaN   9.0
 134.0   NaN   NaN   NaN   NaN   NaN
 133.0   NaN  30.0   3.0   NaN   NaN
 132.0   0.0   NaN  15.0   NaN   NaN

1 个答案:

答案 0 :(得分:1)

对我来说,drop缺少值np.nan

data = (df.pivot("Y","X","Z")
         .sort_values(by=['Y'],ascending=False)
         .drop(np.nan, axis=1)
         .drop(np.nan))

或者:

data = df.pivot("Y","X","Z").sort_values(by=['Y'],ascending=False)

data = data.reindex(index=data.index.difference([np.nan]),
                    columns=data.columns.difference([np.nan]))