从仅包含1列的csv创建数据帧。像这样的数据:[1,2,3],0、100

时间:2019-05-25 13:35:18

标签: python pandas list dataframe

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

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

img

我尝试过的事情:

img

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

csv without columns

2 个答案:

答案 0 :(得分:0)

您可以尝试通过在Python中创建有效的Dataframe,然后用pandas.to_csv输出来查看熊猫如何期望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是包含逗号和双引号的单个字符串字段。

答案 1 :(得分:0)

首先,您正在使用的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