![](/img/trans.png)
[英]How to read a column of datatype json and convert into list using Pandas?
[英]How to convert the datatype of a column from String to List in pandas?
在我的 Panda 的 dataframe 中,我有一组数据类型为字符串的列,我想将它们类型转换到列表中。
例如 - 我想将字符串“ ['C0020649', 'C0020538', 'C0020649']
”转换为列表['C0020649', 'C0020538', 'C0020649']
以便我可以遍历每个元素。
最初,我尝试使用ast.literal_eval()
进行类型转换,但它抛出了 ValueError:
malformed node or string: 14 error.
这里最有趣的是,每当我尝试将数据框列中的值保存为列表时,列的数据类型会自动转换为字符串类型。
提前致谢!
首先,这些列(系列)的dtype
是object
。 它可以包含字符串、列表、数字等。通常它们看起来都一样,因为 pandas 省略了任何引号。 pandas 不使用numpy
字符串数据类型。
df[col].to_numpy()
似乎是查看实际 Series 元素是什么的好方法。
如果列包含列表,则tocsv()
写入列表(或其他对象)的str(alist)
版本。 csv 阅读器将它们加载为字符串; 它不会尝试解析它们。 查看csv
,然后再次检查系列to_numpy()
。
包含列表的系列:
In [377]: s = pd.Series([[1,2,3],[4,5,6]])
In [378]: s
Out[378]:
0 [1, 2, 3]
1 [4, 5, 6]
dtype: object
In [379]: s.to_numpy()
Out[379]: array([list([1, 2, 3]), list([4, 5, 6])], dtype=object)
写入文件:
In [380]: s.to_csv('test.csv', index=False)
In [381]: cat test.csv
0
"[1, 2, 3]"
"[4, 5, 6]"
从文件中读取:
In [382]: df = pd.read_csv('test.csv')
In [383]: df
Out[383]:
0
0 [1, 2, 3]
1 [4, 5, 6]
In [384]: df.to_numpy()
Out[384]:
array([['[1, 2, 3]'],
['[4, 5, 6]']], dtype=object)
注意对字符串的更改。
applying
eval
应用于每个列字符串:
In [389]: df1 = df['0'].apply(eval)
In [390]: df1
Out[390]:
0 [1, 2, 3]
1 [4, 5, 6]
Name: 0, dtype: object
In [391]: df1.to_numpy()
Out[391]: array([list([1, 2, 3]), list([4, 5, 6])], dtype=object)
可能会有更好的东西,但这至少是一个开始。
假设您想用每个单元格的列表版本替换列或添加另一列,这是我想出的一个有点笨拙但非 eval() 的解决方案:
def str_to_list(cell):
cell = ''.join(c for c in cell if c not in "'[]")
cell = cell.split(', ')
return cell
df = pd.DataFrame({'Column 1': ["['C0020649', 'C0020538', 'C0020649']",
"['C0050245', 'C0010689', 'C0042623']",
"['C0045734', 'C0025325', 'C0023542']"]})
df['Column 1'] = df['Column 1'].apply(str_to_list)
或者,如果您更喜欢使用 lambda:
df['Column 1'] = df['Column 1'].apply(lambda cell:
''.join(c for c in cell if c not in "'[]").split(', '))
编辑:如果您在字符串中使用"'"
"["
"]"
或", "
这可能会中断,但看起来你不会,所以没关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.