我有一个包含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']"
每当我尝试读取此csv时,Col3将被读取为str对象而不是列表。我试图将该列的dtype改为列表,但得到了#34;属性错误"如下
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 #----------------------------------------------------------------------
AttributeError:无法设置属性
如果你可以指导我如何去做,真的很棒。
答案 0 :(得分:23)
你可以使用ast lib:
from ast import literal_eval
df.Col3 = df.Col3.apply(literal_eval)
print(df.Col3[0][0])
Proj1
您也可以使用converters
从csv创建数据框时执行此操作:
df = pd.read_csv("in.csv",converters={"Col3": literal_eval})
如果您确定所有字符串的格式相同,则剥离和拆分会更快:
df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").split(", ")})
但是你最终会用引号
包裹的字符串答案 1 :(得分:4)
为坎宁安(Cunninghams)答案添加替换项:
df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").replace("'","").split(", ")})
答案 2 :(得分:2)
如果可以选择写入文件-
您可以使用pd.to_parquet
和pd.read_parquet
(而不是csv)。
它将正确解析此列。
答案 3 :(得分:1)
@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]']
import yaml
df[['A', 'C']] = df[['A', 'C']].applymap(yaml.safe_load)
df['C'].tolist()
# [['a', 'b', 'c'], ['d', 'e', 'f']]
yaml
可以使用pip install pyyaml
安装。
答案 4 :(得分:0)
对此,我有另一种方法,除了列表之外,该方法还可以用于其他数据类型的字符串表示。
您可以使用json库并将json.loads()应用到所需的列。例如
yield
但是,要使其正常工作,您的输入字符串必须用双引号引起来。