Ошибка типа TypeError: 'устанавливается' при извлечении и выборе nan в наборе данных - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь выбрать значения nan в кадре данных panda, выбирая их в столбцах или строках, извлекая их и сохраняя в файле csv, но я столкнулся с TypeError unhashable type: 'set', который мне интересно, как я могу это исправить, чтобы получить результат.

Как видно из следующих сценариев, я выбрал их с помощью функции isnull() после преобразования значений inf в nan для подсчета, но в enc я не смог сохранить значения nan в моем целевом столбце, равном 'C' в CSV-файл из-за TypeError unhashable type: 'set'. Ниже приведены мои сценарии:

import numpy as np
import pandas as pd

#extract the parameters and put them in lists based on id_set
df = pd.read_csv('D:\m22.TXT', header=None)
id_set = df[df.index % 4 == 0].astype('int').values
a = df[df.index % 4 == 1].values
b = df[df.index % 4 == 2].values
c = df[df.index % 4 == 3].values
data = {'A': a[:,0], 'B': b[:,0], 'C': c[:,0] }
main_data = pd.DataFrame(data, columns=['A','B','C'], index = id_set[:,0])
#Mark nan and inf by isnu() function
nan = np.array(main_data.isnull())
inf = np.array(main_data.isnull())
#Make sure to change inf values into nan
main_data = main_data.replace([np.inf, -np.inf], np.nan)
c = main_data.isnull().sum()
print(c)
percent_missing = main_data.isnull().sum() * 100 / len(main_data)
print(percent_missing)
#calculate nan values in percentage in desired column
m = len(main_data) - main_data['A'].count()
print(m)
#Monitor the data
print(main_data)
print (main_data.isnull())
print (main_data.isnull().any(axis=1))
#Select columns has nan(s)
print(main_data[main_data['C'].isnull()])
#Select rows has nan(s) based on id_set
nan_data = main_data[main_data.isnull().any(axis = {'C'})]
print (nan_data)
#write selected part in csv file by id_set
nan_data.to_csv('nan_data.csv', header=None, index=None)

мой фрейм данных выглядит следующим образом:

             A          B            C
0       -56.343656        nan  -418.540483
10      -87.577880 -16.061497          inf
20             nan -15.337254          inf
30      -83.724143 -18.061570  -531.053979
40      -67.462841        nan  -431.924830
50      -63.377158 -28.260790          inf
60             nan -22.996095          nan
70      -38.386860 -35.921773  -534.576631

желаемый вывод для 'C' следующий:

              'C'
10          inf/nan
20          inf/nan
50          inf/nan
60            nan

Вот мой пример набора данных: Пример набора данных DL link

Примечание: id_set значения записаны не полностью, например. 000 отображается как 0 Надеюсь, у кого-то есть хороший совет, чтобы это исправить.

1 Ответ

0 голосов
/ 11 января 2019

Не уверен, что это именно ваша цель, но если вы хотите вывести все строки, в которых хотя бы одна запись - это nan или inf, вы можете попробовать это:

import pandas as pd
import numpy as np

df = pd.DataFrame(50*np.random.randn(8, 3), columns=['A', 'B', 'C'], index=np.arange(0, 80, 10).astype(int))
df.loc[0, 'A'] = np.nan
df.loc[10, 'C'] = np.inf
df.loc[20, 'B'] = np.nan
df.loc[20, 'C'] = np.inf
df.loc[50, 'C'] = np.inf
df.loc[60, 'C'] = np.nan

df[np.isinf(df)] = np.nan    # convert inf to nan

df_nan = df[df.isnull().any(axis=1)]   # extract sub data frame

df_nan.to_csv('nan_data.csv', header=None, index=None)   # export

Фрейм входных данных (после преобразования inf в nan) выглядит следующим образом:

Input, once inf are converted to nan

Вывод выглядит так:

enter image description here

Для вывода метки индекса и 'NaN' в CSV-файле вы можете использовать:

df_nan.to_csv('nan_data.csv', na_rep='NaN')

Будет выведено:

enter image description here

Если вам нужен только столбец «C», вы можете использовать:

df_nan['C'].to_csv('nan_dataC.csv', na_rep='NaN')

Если вы хотите иметь начальные нули, вы можете сделать следующее:

new_index = [str(x).zfill(3) for x in df_nan.index]
df_nan.index = new_index
...