Не допускайте, чтобы NaN стал индексом и столбцом в сводной таблице данных - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть фрейм данных, который я расширяю, чтобы включить значения для всех приращений в 2 столбца. Для этого вводятся значения NaN, как ожидается и желательно.

Однако, когда я использую pivot на этом кадре данных, я получу строку и столбец для 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 голосов
/ 14 ноября 2018

у меня работает 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]))
...