首页 > 解决方案 > 将逗号分隔值从mysql加载到python中的数据框

问题描述

我需要将 csv 格式的数据从 mysql 数据库加载到 python 的数据框中。

数据库中的数据结构如下:

|-----------|-------------------------------------|
|  part_no  |   property                          |
|-----------|-------------------------------------|
|  1        |   eges,4;volume,532                 |
|  2        |   eges,8;color,red                  |
|  3        |   material,wood;price,45;volume,111 |
|  4        |   color,blue                        |
|-----------|-------------------------------------|

属性列表没有预先定义。所以这需要在运行时进行分析。属性的顺序也不总是相同的。

我最后需要的是以下结构的数据框。未定义的值可以为空或显示为 0。

|------------|-------------------------------------------|
|  part_no   | edges | volume | color | material | price |  
|------------|-------------------------------------------|
|   1        |   4   |  532   |       |          |       |
|   2        |   8   |        |  red  |          |       |
|   3        |       |  111   |       |   wood   |  45   |
|   4        |       |        |  blue |          |       |
|------------|-------------------------------------------|

空值可以显示为 0 或空。

谁能指导我正确的方向如何解决这个问题?

标签: pythonmysqlpandascsvdataframe

解决方案


您应该将该列从数据库读取到字典列表(或可迭代)中。

table = #read_from_SQL
records = [dict(cell.split(",") for cell in row)
           for row in table.property.str.split(";")]
# [{'edges': '4', 'volume': '532'},
#  {'color': 'red', 'edges': '8'},
#  {'material': 'wood', 'price': '45', 'volume': '111'},
#  {'color': 'blue'}]

然后你可以使用pandas.DataFrame.from_records

df2 = pd.DataFrame.from_records(records)
#   color edges material price volume
# 0   NaN     4      NaN   NaN    532
# 1   red     8      NaN   NaN    NaN
# 2   NaN   NaN     wood    45    111
# 3  blue   NaN      NaN   NaN    NaN

将值转换为float(如果适用):

df3 = df2.apply(pd.to_numeric, errors='ignore')
#   color  edges material  price  volume
# 0   NaN    4.0      NaN    NaN   532.0
# 1   red    8.0      NaN    NaN     NaN
# 2   NaN    NaN     wood   45.0   111.0
# 3  blue    NaN      NaN    NaN     NaN

不过,您仍然需要将部件号添加到这些字典中。


推荐阅读