首页 > 解决方案 > 如何从python pandas中的列中解析数据

问题描述

我有一个 csv 文件包含以下内容:

原来的

并需要解析它和预期的结果:

结果

文本数据:

id,product_id
    
1,[{'p_id': 59, 'p_name': 'IPF'}, {'p_id': 63, 'p_name': 'RBC'}, {'p_id': 47, 'p_name': 'CSP'}]

2,[{'p_id': 25, 'p_name': 'LPP'}, {'p_id': 86, 'p_name': 'CRS'}, {'p_id': 47, 'p_name': 'CSP'}]

3,[{'p_id': 73, 'p_name': 'OCC'}, {'p_id': 63, 'p_name': 'RBC'}]

4,[{'p_id': 63, 'p_name': 'RBC'}, {'p_id': 31, 'p_name': 'SUT'}, {'p_id': 73, 'p_name': 'OCC'}]

5,[{'p_id': 63, 'p_name': 'RBC'}]

标签: pythonpandas

解决方案


正如我在评论中已经提到的,您拥有的数据没有包含在引号内的字符串值,例如 : in [{'p_id': 59, 'p_name': IPF},该值IPF没有被引号括起来,因此您不能使用任何直接方法。

在几种方法中,最简单的方法是使用yaml( pip install pyyaml) 包将这些字符串值解析为 Python 对象,然后explode应用pd.Series

import pandas as pd
import yaml

filePath = 'file.csv'
df = pd.read_csv(filePath, index_col=0)
out = (df['product_id'].apply(lambda x: yaml.load(x, yaml.Loader))
        .explode()
        .apply(pd.Series)
       )

输出

>>> out
    p_id p_name
id             
1     59    IPF
1     63    RBC
1     47    CSP
2     25    LPP
2     86    CRS
2     47    CSP
3     73    OCC
3     63    RBC
4     63    RBC
4     31    SUT
4     73    OCC
5     63    RBC

推荐阅读