【问题标题】:create a dataframe from a csv with only 1 column incl. data like this: [1,2,3], 0, 100从仅包含 1 列的 csv 创建数据框。像这样的数据:[1,2,3], 0, 100
【发布时间】:2019-10-11 19:19:05
【问题描述】:

我不能使用逗号分隔符,因为列表中的第一个元素中也有逗号。

也许我必须首先在“]”处拆分并创建 2 列,然后替换第一列中的逗号。但我认为,这不是推荐的方式。

我尝试过的:

将在 Excel 中创建的 data.csv 上传到 Jupiter Notebook 后,列似乎消失了,因此我无法使用建议的 A 属性。有没有类似的方法?

csv without columns

【问题讨论】:

  • 我不确定我是否理解您的问题,但在 csv 中,您可以对包含逗号的列使用双引号 ""[0,1,2]",0,10
  • 在您的示例文件中有三个标题,您想用它们做什么合并到单个标题中或忽略它们
  • 避免在您的问题中发布纯文本图片。这是不必要的,并且可以防止您的代码或输入数据被复制并粘贴到答案中。

标签: python pandas list dataframe


【解决方案1】:

您可以通过在 Python 中创建一个有效的 Dataframe 进行试验,然后使用 pandas.to_csv 将其输出,以查看 pandas 期望 CSV 数据帧如何格式化(假设它应该能够“往返”自己的数据帧)。

我在https://repl.it/languages/python3 测试了以下内容(使用我的最小 Python 和零熊猫经验):

import pandas as pd
df = pd.DataFrame({'list': [[5,6,7,8]],
                   'true': 0,
                   'amount': 210})
csv = df.to_csv(index=False)
print(csv)

输出是:

list,true,amount
"[5, 6, 7, 8]",0,210

列表字段中的前导空格是由pandas.to_csv 添加的,但我怀疑pandas.read_csv 解析器是否需要它们。

这个结果是我在任何情况下都会假设的,因为这是在 CSV 的字段中包含逗号的定义方法。带引号的字段是可选的,但包含逗号的字段是必需的。

所以你的 CSV 数据应该是:

list,true,amount
"[5,6,7,8]",0,210
"[2,2,0]",1,110
"[2,7]",0,200 

如果字段本身包含双引号,则重复双引号,如 https://en.wikipedia.org/wiki/Comma-separated_values 示例中所示

1997,Ford,E350,"Super, ""luxurious"" truck"

其中字符串Super, "luxurious" truck 是包含逗号和双引号的单个字符串字段。

【讨论】:

  • CSV 文件中的数据格式不正确。使用literal_eval,您可以将多种数据类型转换为一个元组。查看我的答案以获取更多详细信息。
  • @DeepankarSharma :我认为没有必要通过在我的评论中宣传您的答案。你的解释了如何处理损坏的 CSV,我的解释了如何更正 CSV 格式以直接由pandas.read_csv 解析。这两个答案都不正确,如果已经存在大量这样格式化的数据,你的答案是合适的,如果此时可以更正 CSV 格式,我的答案更合适。
  • 没有必要如此敌对,尤其是对那些试图在这个社区做出更多贡献的新人。如果与您分享解决问题的不同方法看起来像广告,那么问题在于您自己的看法。
  • 你不应该将其视为敌意——那不是我的本意。您的答案很清楚,所有人都能看到在同一页面上,“共享”是不必要的。看起来好像你在说“这个答案不正确,看看我的” 或许这不是你想要的,我不认为是这样。如果它不正确,请直接说出来,它有什么问题。在任何情况下,这个问题都指出了 CSV 无效的事实。我不是 pandas 或 Python 方面的专家,我只是因为它被错误地标记为“嵌入式”而遇到它,这是我的专长。
  • 谢谢 Clifford,但是 data.csv 是给定的数据集,只是简化了。我需要 Deepankar Sharma 描述的输出,不幸的是,通过将 data.csv 上传到 jupiter 笔记本,Excel 中的列似乎消失了。也许你还有其他想法?
【解决方案2】:

首先,您使用的 CSV 文件的格式很差。您永远不应该将多种数据类型放在一个列中。但是,可以将存在于单个列中的多种数据类型分开。

您可以这样做:

import pandas as pd
from ast import literal_eval

df = pd.read_csv('data.csv', usecols=[0], sep=';', header=None)
colA = df[0][1:].apply(literal_eval)
print(colA.head())

输出:

>> 1    ([5, 6, 7, 8], 0, 210)
>> 2       ([2, 2, 0], 1, 110)
>> 3          ([2, 7], 0, 200)
>> Name: A, dtype: object

使用; 作为分隔符,因为它不在该列的任何地方使用。 colA 是熊猫系列对象。
列值转换为 3 种数据类型的 tupleListintint
你可以像这样遍历它们:

for row in colA:
    l, t, a = row
    print(f'List={l}, True={t}, Amount={a}')

输出:

>> List=[5, 6, 7, 8], True=0, Amount=210
>> List=[2, 2, 0], True=1, Amount=110
>> List=[2, 7], True=0, Amount=200

【讨论】:

  • 嗨 Deepankar Sharma,感谢您的想法。我认为这正是我所需要的。我知道,csv 并不完美,但这正是必须要做的。当然,有很多行,只是为了简化。我完全按照你的建议做了,不幸的是出现以下错误:“AttributeError:'DataFrame'对象没有属性'A'”。我将 data.csv 与上传到笔记本的 data.csv 进行了比较。他们是对的,在 jupiter notebook 中的 csv 中没有可查看的列。你有什么建议?
  • @Losolak CSV 文件似乎没有标题。您应该在 read_csv 方法中传递 header=None。检查我更新的答案。
  • 谢谢,Deepankar Sharma,它工作得很好。我投票了,很遗憾这是我第一次尝试了解stackoverflow,所以我的声誉低于15,所以你看不到它。你真的帮了我很多!
  • @Losolak:新用户不能对答案投赞成票,但如果它回答了您的问题,您可以接受它。 stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多