Отбрасывание нулей и нарезка из поворотной таблицы в Pandas - PullRequest
0 голосов
/ 17 января 2020

У меня проблемы с разрезанием моего поворотного фрейма данных, чтобы получить результаты выше определенного порога. Я пытаюсь отфильтровать результаты, которые падают ниже минимального значения. Мой фрейм данных выглядит так:

                                                                                    Qty                             
Index   Store_Nbr   201712  201801  201802  201803  201804  201805  201806  201807  201808
0               1      356     275     293     256     313     421     493     291     385
1               2      147     316     343     416     361     483     438     136     461
2               3      266     370     162     346     451     414     296     478     295
3               4      322     179     353     241     370     247     423     391     194
4               5      249     389     480     450     102     482     137     251     153
...            ...     ...     ...     ...     ...     ...     ...     ...     ...     ...
30             30        0       0       0       0       0       0       0       0       0
31             31        0       0       0       0       0       0       0       0       0
32             32        0       0       0       0       0       0       0       0       0
33             33      392     311     151     488     135     239     212     104     122
34             34        0       0       0       0       0       0       0       0      -1

После использования godzilla = godzilla[godzilla['Qty'] > 150] я получаю приведенный ниже фрейм данных, где он преобразовал все нули в нули и ничего не отфильтровал.

                                                                                     Qty                                
Index   Store_Nbr   201712   201801  201802  201803  201804  201805  201806  201807  201808
0             NaN      NaN      275     293     256     313     421     493     291     385
1             NaN      147      316     343     416     361     483     438     136     461
2             NaN      266      370     162     346     451     414     296     478     295
3             NaN      NaN      179     353     241     370     247     423     391     194
4             NaN      389      480     450     102     482     137     251     153     153
...           ...     ...       ...     ...     ...     ...     ...     ...     ...     ...
30            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
31            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
32            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
33            NaN      NaN      311     151     488     135     239     212     104     122
34            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN

Я пытался сделать godzilla.dropna(axis = 0, inplace = True, how = 'any'), который возвращает пустой фрейм данных, и godzilla = godzilla.dropna( subset = godzilla['Qty']), который возвращает KeyError: 'Qty'. Я сбит с толку, что он конвертировал нули в нули и почему срез не работает. Любые мудрые слова при попытке отфильтровать / нарезать сводные данные?

Примечание ** Что у меня больше, чем Qty, поворачивается во фрейме данных.

Ответы [ 3 ]

0 голосов
/ 17 января 2020

Да! Вы работаете с иерархической структурой, мультииндексом. Поэтому столбцы не удаляются, а заменяются на NaN. Если нет других индексов, кроме Qty, вы можете использовать:

godzilla.columns = godzilla.columns.droplevel()

, а затем следовать с dropna():

godzilla = godzilla.dropna(how='any',axis=0)
0 голосов
/ 27 января 2020

Я наконец понял это. Извините за задержку. Цените ответы, которые вы все выдвинули. Ошибка была полностью с моей стороны. Ранее в коде я использовал .drop_index(), потому что в то время я не понимал, что могу манипулировать индексом, используя .index. После того, как я исправил код, у меня не было проблем с настройкой параметров с помощью godzilla = godzilla[godzilla['Qty'] > 150].dropna().

0 голосов
/ 17 января 2020

Сначала вы заменяете каждое значение меньше 150 на None.
Чем вы должны отфильтровать строку, по крайней мере, с 1 значением None, как описано в в этом ответе

Это должно сделать трюк:

# replaces every value of the DataFrame lower than 150 with None
godzilla = pd.DataFrame([
    [x if not isinstance(x, (int, float)) or x >= 150 else None for x in j
] for j in godzilla.as_matrix()])

# replaces every value of the Column "Qty" lower than 150 with None
df["Qty"] = [x if not isinstance(x, (int, float)) or x >= 20 else None for x in df["Qty"]

#dropna will drop all rows with at least 1 null value
df = df.dropna(how='any',axis=0)
...