pandas 将包含列表的字符串列表转换为 Dataframe

svmlkihl  于 2022-12-09  发布在  其他
关注(0)|答案(4)|浏览(155)

我有一个字符串列表,我想把它转换成一个 Dataframe ,但是列表对象中的“,”把我采取的每一种方法和任何想法都搞砸了。
例如:y = [“a,['b'],0.3,1”,“a,['b,c'],0.4,2”]
应改为:包含4列的df,其中包含“a”、[“b”]、0.3、1“a”、[“b,c”]、0.4、2
这是目前为止我找到的最接近的一个,但它崩溃了,因为它看到第二行有5个元素,而不是4个。df = pd.read_csv(io.StringIO(“\n”.join(y)),delimiter=",",header=None))谢谢。

8wigbo56

8wigbo561#

首先,我会搜索并修复根本问题(如果可能的话-数据是如何生成的)?
如果无法修复,您可以尝试:

import csv
import pandas as pd
from io import StringIO

y = ["a,['b'],0.3,1", "a,['b,c'],0.4,2"]

out = []
for s in y:
    s = StringIO(s.replace("[", "").replace("]", ""))
    out.append(next(csv.reader(s, quotechar="'")))

df = pd.DataFrame(out, columns=["Col1", "Col2", "Col3", "Col4"])
df["Col2"] = df["Col2"].str.split(",")

print(df)

印刷品:

Col1    Col2 Col3 Col4
0    a     [b]  0.3    1
1    a  [b, c]  0.4    2
8oomwypt

8oomwypt2#

您可以使用re.sub将字符串中的列表部分用"包围起来,然后使用\n加入列表,然后使用read_csvquotechar参数忽略"

import re
s = '\n'.join([re.sub(pattern=r'(\[.*\])', repl='"' + '\\1' + '"',string=s) for s in y])
df = pd.read_csv(StringIO(s), quotechar='"', header=None)

打印(df):

0        1    2  3
0  a    ['b']  0.3  1
1  a  ['b,c']  0.4  2
2nbm6dog

2nbm6dog3#

数据中的列表对象很奇怪。如果你真的想把它们作为列表,另一个答案是正确的。但是如果你想把它们作为字符串,例如,“['b,c']",这会更快:

p = re.compile(",(?![^\[]*\])")
for i in range(len(y)):
  y[i] = re.sub(p, "\t", y[i])
df = pd.read_csv(io.StringIO("\n".join(y)),delimiter='\t',header=None)
oogrdqng

oogrdqng4#

另一个可能的解决方案是使用带有lookahead的正则表达式拆分来防止['b,c']中的逗号拆分:

import re

df = pd.DataFrame([re.split(r',(?!\w+\'\])', s) for s in y])
df.columns = [f'col{i+1}' for i in range(df.shape[1])]

输出量:

col1     col2 col3 col4
0    a    ['b']  0.3    1
1    a  ['b,c']  0.4    2

相关问题