如何在Python中提取字符串中的列表?

Chr*_*ris 4 python

我使用Pandas导入了CSV,并使用字符串条目读入了一列.检查本系列(列)的条目,我发现它们实际上应该是列表.例如:

df['A'] = pd.Series(['["entry11"]', '["entry21","entry22"]', '["entry31","entry32"]'])
Run Code Online (Sandbox Code Playgroud)

我想从字符串中提取列表元素.到目前为止,我已经尝试了以下链:

df['A'] = df['A'].replace("'",'',regex=True).
                  replace('\[','',regex=True).
                  replace('\]','',regex=True).
                  str.split(",")
Run Code Online (Sandbox Code Playgroud)

(当然,所有在一条线上).

这让我在一列中找回了我想要的列表元素.

  • [ ' "entry11"']
  • ['"entry21","entry22"']
  • ['"entry31","entry32"']

我的问题:有没有更有效的方法呢?对于应该更容易一些的东西来说,这似乎很紧张.

ale*_*cxe 6

你可以"应用"ast.literal_eval()在系列:

In [8]: from ast import literal_eval

In [9]: df['A'] = df['A'].apply(literal_eval)

In [10]: df
Out[10]: 
                    A
0           [entry11]
1  [entry21, entry22]
2  [entry31, entry32]
Run Code Online (Sandbox Code Playgroud)

也有map()applymap()-这里是讨论其不同之话题:

  • @AdamSmith一般来说,你想要出于性能原因而狂热`.apply`,因为它只是在Python中包含一个for循环,尽管在某些情况下你没有选择. (2认同)
  • @Chris 当然,如果 `"entry"` 被括在引号中,那么 `literal_eval` 将能够安全地评估它(该解决方案将按原样工作)。如果没有,您可能需要一个自定义函数,您可以在其中处理由 `literal_eval()` 抛出的可能的 `ValueError` 并返回,例如,相同的未评估字符串。 (2认同)