【问题标题】:TypeError unhashable type: 'set' when you extract and select nan in datasetTypeError unhashable type: 'set' 当你在数据集中提取和选择 nan
【发布时间】:2019-06-06 13:07:20
【问题描述】:

我试图通过在列或行中选择它们来选择熊猫数据框中的 nan 值,然后提取它们并保存在 csv 文件中,但我遇到了 TypeError unhashable type: 'set' 我想知道如何修复它得到结果。

从以下脚本中可以看出,我在将 inf 值转换为 nan 以进行计数后使用 isnull()function 选择了它们,但在 enc 中,我无法将 nan 值存储在目标列 'C'由于TypeError unhashable type: 'set',在csv文件中。以下是我的脚本:

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

下面是我的数据集示例:dataset sample DL link

注意:id_set 值的写入不完整,例如。 000 显示为 0 希望有人有一个很好的提示来解决它。

【问题讨论】:

  • 请发布整个堆栈跟踪。否则,我们必须仔细研究您的代码,试图找出是哪一行引发了异常,而这几乎总是促使我们去查看下一个问题。
  • 由于丢失的数据出现在数据集的中间,我很难找到并发布整个堆栈跟踪,希望你能理解我。但我会上传文本文件,希望能解决!
  • Unhashable 意味着需要一个不可变的数据类型,但找到了一个可变的数据类型(例如,有一个集合作为字典键)。因此,寻找发生这种情况的地方,您就会解决问题。
  • 恐怕我明白。 Traceback (most recent call last):TypeError unhashable type: 'set' 之间的行数不能超过几十行。这些是我们想要看到的线条。没有它们,很难说出问题所在。您很容易找到错误消息。如果您需要帮助,请帮助我们为您提供帮助。
  • @BoarGules 绝对正确,这就是我上传数据集样本的原因。我希望你能跟着我。

标签: python dataframe typeerror nan missing-data


【解决方案1】:

不确定这是否正是您的目标,但如果您想输出至少有一个条目是 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后)如下所示:

输出如下:

要在 csv 文件中输出索引标签和“NaN”,您可以使用:

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

这将输出:

如果您只想要列“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

【讨论】:

  • 我相信手动标记 nan 和 inf 值没有任何意义!我想知道我们是否可以选择缺失值并将其存储在 id_set 的 csv 文件中,这有助于找到缺失值的位置!我的数据集中有很多缺失值!
  • 嗨马里奥,手工标记只是为了重现一个与您发布的具有相似结构的数据框。我在链接可用之前写了它。只是一个例子。无法打开链接。如果您打印数据框中的前 6 行,我们很乐意提供帮助。
  • 嗨,伙计!我明白了,您还有其他建议来完成这项任务吗?
  • 你能打印数据框的前几行吗?另外,您想提取至少一个值为 inf 或 nan 的所有行?
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2021-08-27
  • 2021-08-31
  • 2021-08-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2016-01-24
相关资源
最近更新 更多