如何使用pandas将csv列作为dtype列表读取?

nac*_*npl 24 python csv pandas

我有一个包含3列的csv文件,其中第3列的每一行都包含值列表.从下表结构中可以看出

Col1,Col2,Col3
1,a1,"['Proj1', 'Proj2']"
2,a2,"['Proj3', 'Proj2']"
3,a3,"['Proj4', 'Proj1']"
4,a4,"['Proj3', 'Proj4']"
5,a5,"['Proj5', 'Proj2']"
Run Code Online (Sandbox Code Playgroud)

每当我尝试读取此csv时,Col3将被读取为str对象而不是列表.我试图改变列的dtype列表,但得到"属性错误"如下

df = pd.read_csv("inputfile.csv")
df.Col3.dtype = list

AttributeError                            Traceback (most recent call last)
<ipython-input-19-6f9ec76b1b30> in <module>()
----> 1 df.Col3.dtype = list

C:\Python27\lib\site-packages\pandas\core\generic.pyc in __setattr__(self,         name, value)
   1953                     object.__setattr__(self, name, value)
   1954             except (AttributeError, TypeError):
-> 1955                 object.__setattr__(self, name, value)
   1956 
   1957     #----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

AttributeError:无法设置属性

如果你可以指导我如何去做它真的很棒.

Pad*_*ham 28

你可以使用ast lib:

from ast import literal_eval


df.Col3 = df.Col3.apply(literal_eval)
print(df.Col3[0][0])
Proj1
Run Code Online (Sandbox Code Playgroud)

您还可以在使用converters以下命令从csv创建数据框时执行此操作:

df = pd.read_csv("in.csv",converters={"Col3": literal_eval})
Run Code Online (Sandbox Code Playgroud)

如果您确定所有字符串的格式相同,则剥离和拆分将更快:

 df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").split(", ")})
Run Code Online (Sandbox Code Playgroud)

但是你最终会用引号括起来的字符串

  • 为了这个简单的答案,我花了 30 分钟谷歌搜索。 (2认同)

5no*_*rre 9

向 Cunninghams 答案添加替换:

df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").replace("'","").split(", ")})
Run Code Online (Sandbox Code Playgroud)

另见pandas - 将字符串转换为字符串列表

  • 这是一个简洁的解决方案,但它不处理空字符串,lambda 为输入“[]”提供“['']” (2认同)

cs9*_*s95 6

如果您必须解析没有引号的字符串列表,@Padraic Cunningham 的答案将不起作用。例如,literal_eval将成功解析"['a', 'b', 'c']",但无法解析"[a, b, c]"。要加载这样的字符串,请使用PyYAML库。

import io 
import pandas as pd

data = '''
A,B,C
"[1, 2, 3]",True,"[a, b, c]"
"[4, 5, 6]",False,"[d, e, f]"
'''

df = pd.read_csv(io.StringIO(data), sep=',')                                    
df
           A      B          C
0  [1, 2, 3]   True  [a, b, c]
1  [4, 5, 6]  False  [d, e, f]

df['C'].tolist()                                                           
# ['[a, b, c]', '[d, e, f]']
Run Code Online (Sandbox Code Playgroud)

import yaml
df[['A', 'C']] = df[['A', 'C']].applymap(yaml.safe_load) 

df['C'].tolist()                                                           
# [['a', 'b', 'c'], ['d', 'e', 'f']]
Run Code Online (Sandbox Code Playgroud)

yaml可以使用安装pip install pyyaml


小智 5

我对此有一种不同的方法,除了列表之外,它还可以用于其他数据类型的字符串表示。

您可以使用 json 库并将 json.loads() 应用于所需的列。例如

import json
df.my_column = df.my_column.apply(json.loads)
Run Code Online (Sandbox Code Playgroud)

但是,要使其起作用,您的输入字符串必须用双引号引起来。


the*_*etz 5

如果您可以选择写入文件 -

您可以使用pd.to_parquetpd.read_parquet(而不是 csv)。

它将正确解析此列。