将 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将数据框转换为具有多个值的字典

如何将带有元组键的 python 字典转换为 pandas 多索引数据框?

在 Python pandas 中将 xlsx 文件转换为字典

使用元组键将 Pandas 数据框转换为字典以进行三元图

将字典转换为 pandas 数据框