Обработка нулей или NaN в операциях Pandas DataFrame - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть DataFrame (df), как показано ниже, где каждый столбец сортируется от наибольшего к наименьшему для частотного анализа.Это оставляет некоторые значения либо нулей, либо значений NaN, так как каждый столбец имеет разную длину.

   08FB006 08FC001 08FC003 08FC005 08GD004
----------------------------------------------
0   253      872    256      11.80    2660
1   250      850    255      10.60    2510
2   246      850    241      10.30    2130
3   241      827    235      9.32     1970
4   241      821    229      9.17     1900
5   232       0     228      8.93     1840
6   231       0     225      8.05     1710
7   0         0     225       0       1610
8   0         0     224       0       1590
9   0         0      0        0       1590
10  0         0      0        0       1550

Мне нужно выполнить следующие вычисления, как если бы каждый столбец имел разную длину или количество записей (игнорируя нулевые значения).Я пытался использовать NaN, но по какой-то причине операции над значениями Nan невозможны.

Вот что я пытаюсь сделать со своими столбцами df:

shape_list1=[]
location_list1=[]
scale_list1=[]

for column in df.columns:
    shape1, location1, scale1=stats.genpareto.fit(df[column])

    shape_list1.append(shape1)
    location_list1.append(location1)
    scale_list1.append(scale1)

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Синтаксис беспорядочный, но измените

shape1, location1, scale1=stats.genpareto.fit(df[column])

на

shape1, location1, scale1=stats.genpareto.fit(df[column][df[column].nonzero()[0]])

Объяснение: df[column].nonzero() возвращает кортеж размера (1,), единственный элемент которого, элемент [0], это пустой массив, содержащий метки индекса, где df не равен нулю.Чтобы индексировать df[column] по этим ненулевым меткам, вы можете использовать df[column][df[column].nonzero()[0]].

0 голосов
/ 23 ноября 2018

Предполагая, что все значения положительные (как видно из вашего примера и описания), попробуйте:

stats.genpareto.fit(df[df[column] > 0][column])

. Этот фильтр фильтрует каждый столбец для работы только с положительными значениями.Или, если допустимы отрицательные значения,

stats.genpareto.fit(df[df[column] != 0][column])
...