繁体   English   中英

如何在 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. 

这里最有趣的是,每当我尝试将数据框列中的值保存为列表时,列的数据类型会自动转换为字符串类型。

提前致谢!

首先,这些列(系列)的dtypeobject 它可以包含字符串、列表、数字等。通常它们看起来都一样,因为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM