【问题标题】:Unable to load csv file into Dataframe using Surprise in Python无法在 Python 中使用 Surprise 将 csv 文件加载到 Dataframe 中
【发布时间】:2018-03-15 17:41:02
【问题描述】:

情景

要导入的数据集包含相当多的NaN 值。同样,我在 Python 中使用 SurPRISE 包(由 Nicholas Hug 编写)而不是使用 Pandas。原因是预测 NaN 值的方法适用于上述软件包。

问题

数据集post_df1.csv如下:

       uid     iid       rat
1    303.0   785.0  3.000000
2    291.0  1042.0  4.000000
3    234.0  1184.0  2.000000
4    102.0   768.0  2.000000
5    181.0  1081.0  1.000000
...
194  944.0  110.0       NaN
195  944.0  111.0       NaN
196  944.0  112.0       NaN
197  944.0  113.0       NaN
198  944.0  114.0  5.000000
199  944.0  115.0  5.000000

使用 SurPRISE 导入

reader = Reader(line_format="user item rating", sep='\t', rating_scale=(1, 5))
df = Dataset.load_from_file('post_df1.csv', reader=reader)

返回错误:

Traceback (most recent call last):
  File "<input>", line 3, in <module>
  File "/home/x/.local/lib/python2.7/site-packages/surprise/dataset.py", line 173, in load_from_file
    return DatasetAutoFolds(ratings_file=file_path, reader=reader)
  File "/home/x/.local/lib/python2.7/site-packages/surprise/dataset.py", line 306, in __init__
    self.raw_ratings = self.read_ratings(self.ratings_file)
  File "/home/x/.local/lib/python2.7/site-packages/surprise/dataset.py", line 205, in read_ratings
    itertools.islice(f, self.reader.skip_lines, None)]
  File "/home/x/.local/lib/python2.7/site-packages/surprise/dataset.py", line 455, in parse_line
    return uid, iid, float(r) + self.offset, timestamp
ValueError: could not convert string to float: 

我无法弄清楚,字符串在哪里!因为使用 Pandas 读取 post_df1.csv 时,返回以下内容:

post_df1.dtypes

uid    float64
iid    float64
rat    float64
dtype: object

问题

  1. 使用此包读取它时,可能会将整个数据视为字符串吗?
  2. 我在错误中注意到,float 在 Dataset.py 中有一个偏移量和时间戳作为返回值。如何将其限制为 uid、iid、rat / float

返回 uid, iid, float(r) + self.offset, 时间戳 3. 列表项

参考

Suprise Package Docs

编辑 #1

所以,这就是 post_df1post_df2 的形成方式。同样对于 post_df1,我尝试从第 1 行开始取值,以防第 0 行是标题。

# PRE PROCESSED CLUSTER 0 -- Named to POST DataFrame1
if flag1 is 1:
    print pre_df01
    post_df1 = pre_df01.iloc[1:, :]
elif flag1 is 2:
    print pre_df02
    post_df1 = pre_df02.iloc[1:, :]
elif flag1 is 3:
    print pre_df03
    post_df1 = pre_df03.iloc[1:, :]

# PRE PROCESSED CLUSTER 1 -- Named to POST DataFrame2
if flag2 is 1:
    print pre_df11
    post_df2 = pre_df11
elif flag2 is 2:
    print pre_df12
    post_df2 = pre_df12
elif flag2 is 3:
    print pre_df13
    post_df2 = pre_df13

在这里,我已经尝试删除标题和索引以避免其中包含任何字符串类型。

# EXPORT TO CSV & LOAD AGAIN IN PROGRAM
post_df1.to_csv("post_df1.csv", sep='\t', index=False, header=False)
post_df2.to_csv("post_df2.csv", sep='\t', index=False, header=False)

由于导入是代码中的问题,我使用电子表格查看了 csv 文件,如下所示 显然它没有标题。

【问题讨论】:

    标签: python python-2.7 pandas csv dataframe


    【解决方案1】:

    这个错误似乎是因为 post_df1.csv 中每一列的标题,它是字符串格式。当您从 csv 文件中删除具有列名的第一行时,您的 sn-p 代码应该可以正常工作。

    【讨论】:

    • 原来我确实预测到了这一点,并尝试了post_df1 = pre_df02.iloc[1:, :],但没有帮助。关于如何使用 pre_def02.iloc[1:, :](这是一个 Pandas 数据框)获得 header = False 的任何想法。
    • 您可以使用 .to_csv('post_df1.csv', index=False, header=None) 方法保存 post_df1 DataFrame。结果,您将获得带有浮点数且没有标题的 csv 文件。之后,您可以执行您的 sn-p 代码。在你的情况下,从过去的评论中,你保存 post_df1 没有第一行,但有标题。
    • 并且您应该将分隔符指定为 '\t'。之后应该是这样的 pre_df02.to_csv('post_df1.csv', index=False, header=None, sep='\t')。而且您不应该将结果分配给变量。
    • 埃德还有什么想法吗?如果没有,我希望有更好的选择。
    • 这条线现在可以工作了吗? df = Dataset.load_from_file('post_df1.csv', reader=reader)。并从参数中删除 rating_scale=(1, 5),在这种情况下它是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2020-09-27
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    相关资源
    最近更新 更多