将 Python 字典转换为 Pandas 数据框
Posted
技术标签:
【中文标题】将 Python 字典转换为 Pandas 数据框【英文标题】:Convert Python Dictionary to Pandas Dataframe 【发布时间】:2018-09-12 16:16:48 【问题描述】:我正在将 python 列表/字典转换为 pandas 数据框:
import numpy as np
import pandas as pd
points = [
'coords': (100.5, 100), 'class': 1,
'coords': (300, 300), 'class':2,
'coords': (50, 200), 'class':4,
'coords': (550, 400), 'class':10,
'coords': (550, 300), 'class':1
]
# pandas data frame
data = np.array([['x', 'y', 'class']])
for point in points:
row = [point['coords'][0], point['coords'][1], point['class']]
data = np.vstack((data, row))
df = pd.DataFrame(data[1:])
df.columns = data[0:1].tolist()
这给出了以下df:
x y class 0 100.5 100.0 1.0 1 300 300 2 2 50 200 4 3 550 400 10 4 550 300 1
但是,如果我现在尝试进行如下计算:
df['mult'] = df['x'] * df['y']
我收到一个错误:
ValueError: 传递的项目数错误 2,位置暗示 1
【问题讨论】:
奇怪,从df
中选择列返回DataFrame
类型的对象,谁能解释一下为什么会这样?
【参考方案1】:
为什么会发生这种情况(所有列都有
object
dtype)?
在这一行之后:
In [100]: data = np.array([['x', 'y', 'class']])
数组data
将有object
(字符串)dtype:
In [101]: data.dtype
Out[101]: dtype('<U5')
在连接数值之后:
In [102]: data = np.vstack((data, (100.5, 100, 1)))
In [103]: data
Out[103]:
array([['x', 'y', 'class'],
['100.5', '100.0', '1.0']], dtype='<U32')
In [104]: data.dtype
Out[104]: dtype('<U32')
您只能收集data
中的数值并按如下方式构造DF:
df = pd.DataFrame(data, columns=['x', 'y', 'class'])
但我会尝试一种稍微不同的方法:
In [80]: df = pd.DataFrame(points)
In [81]: df[['x','y']] = df.pop('coords').apply(pd.Series)
In [82]: df
Out[82]:
class x y
0 1 100.5 100.0
1 2 300.0 300.0
2 4 50.0 200.0
3 10 550.0 400.0
4 1 550.0 300.0
In [83]: df['mult'] = df['x'] * df['y']
In [84]: df
Out[84]:
class x y mult
0 1 100.5 100.0 10050.0
1 2 300.0 300.0 90000.0
2 4 50.0 200.0 10000.0
3 10 550.0 400.0 220000.0
4 1 550.0 300.0 165000.0
【讨论】:
【参考方案2】:您可以尝试将数据帧的 dtype 转换为浮点数并使用 np.multiply 函数。
import numpy as np
import pandas as pd
points = [
'coords': (100.5, 100), 'class': 1,
'coords': (300, 300), 'class':2,
'coords': (50, 200), 'class':4,
'coords': (550, 400), 'class':10,
'coords': (550, 300), 'class':1
]
# pandas data frame
data = np.array([['x', 'y', 'class']])
for point in points:
row = [point['coords'][0], point['coords'][1], point['class']]
data = np.vstack((data, row))
df = pd.DataFrame(data[1:],dtype=float)
df.columns = data[0:1].tolist()
df['mult'] = np.multiply(df['x'],df['y'])
df['mult']
mult
0 10050.0
1 90000.0
2 10000.0
3 220000.0
4 165000.0
【讨论】:
以上是关于将 Python 字典转换为 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中使用pandas将字典列表转换为数据框[重复]
如何将带有元组键的 python 字典转换为 pandas 多索引数据框?