将逗号分隔的值从mysql加载到python中的数据框

时间:2018-12-07 12:46:43

标签: python mysql pandas csv dataframe

我需要以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或为空。

任何人都可以指导我正确的方法吗?

1 个答案:

答案 0 :(得分:0)

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

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

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