【问题标题】:Convert Python Dictionary to Pandas Dataframe将 Python 字典转换为 Pandas 数据框
【发布时间】: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类型的对象,谁能解释一下为什么会这样?

标签: python pandas


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 2022-09-30
      • 2019-02-22
      • 2017-07-16
      • 2020-12-22
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多