【问题标题】:Load comma seperated values from mysql to dataframe in python将逗号分隔值从mysql加载到python中的数据框
【发布时间】:2019-05-09 05:45:50
【问题描述】:

我需要将 mysql 数据库中类似 csv 格式的数据加载到 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 或空。

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

【问题讨论】:

  • 打错字了 ;)

标签: python mysql pandas csv dataframe


【解决方案1】:

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

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

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

【讨论】:

  • 正是我想要的。非常感谢!
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多