我有一个txt文件,其中一列包含数组-每行具有与该列的值不同的大小的数组(该数组内部包含字符串,用逗号分隔并用引号定义)。这是一个示例:
Color Count People
0 Red 2 ["Ben", "Mike"]
1 Blue 0 []
2 Yellow 3 ["Ben", "Mike", "Tom"]
我想以Pandas作为数据框处理此文件。我已经尝试过多种方法,包括正则表达式来读取文件,但没有成功。
我想我可能必须逐行阅读并迭代创建表格,但是我不确定如何。
将不胜感激建议
您的样本看起来很像熊猫数据框的显示。将这样的框架保存到csv会有一些相同的问题,尽管可能更简单。我最近对一个类似的案例做出了回应,不同之处在于列表被numpy数组取代。
无论如何,让我们尝试简单的娱乐。
定义字典:
In [77]: {'Color':'Red', 'Count':2, 'People':['Ben','Mike']}
Out[77]: {'Color': 'Red', 'Count': 2, 'People': ['Ben', 'Mike']}
In [78]: pd.DataFrame([_])
Out[78]:
Color Count People
0 Red 2 [Ben, Mike]
或具有3行:
In [79]: pd.DataFrame([_77,_77,_77])
Out[79]:
Color Count People
0 Red 2 [Ben, Mike]
1 Red 2 [Ben, Mike]
2 Red 2 [Ben, Mike]
如果我们将其写入csv:
In [80]: df = pd.DataFrame([_77,_77,_77])
In [81]: df.to_csv('stack59675154.txt')
In [82]: cat stack59675154.txt
,Color,Count,People
0,Red,2,"['Ben', 'Mike']"
1,Red,2,"['Ben', 'Mike']"
2,Red,2,"['Ben', 'Mike']"
这类似于您的csv,除了使用逗号分隔符,并引用列表。它实际上是在保存列表的打印字符串str(['Ben', 'Mike'])
。
熊猫可以阅读:
In [83]: data = pd.read_csv('stack59675154.txt')
In [84]: data
Out[84]:
Unnamed: 0 Color Count People
0 0 Red 2 ['Ben', 'Mike']
1 1 Red 2 ['Ben', 'Mike']
2 2 Red 2 ['Ben', 'Mike']
In [85]: data['People'][0]
Out[85]: "['Ben', 'Mike']"
但是People
列实际上包含字符串,而不是列表。幸运的是字符串可以是eval
:
In [86]: eval(_)
Out[86]: ['Ben', 'Mike']
有一个更安全的字符串评估器,但我不会讲这个。
0,Red,2,"['Ben', 'Mike']"
如果不带引号,读者会遇到问题,因为它将在方括号内看到定界符。简单的numpy.genfromtxt
阅读器甚至可以处理这些引号。简单的读者只需使用line_list = line.split(delimiter)
,即可获得一个字符串列表,每个“列”一个。
我相信csv
模块中的读者可以被指示处理嵌套引号,甚至嵌套括号。