当前位置: 首页 > 面试题库 >

pandas:如何使用多索引进行数据透视?

司空朝
2023-03-14
问题内容

我想对pandas进行一次透视DataFrame,索引是两列,而不是一列。例如,一个字段用于年份,一个字段用于月份,一个“ item”字段显示“
item 1”和“ item 2”,以及一个“ value”字段和数值。我希望索引为年+月。

我设法做到这一点的唯一方法是将两个字段合并为一个,然后再次将其分开。有没有更好的办法?

最少的代码复制到下面。非常感谢!

PS:是的,我知道关键字“ pivot”和“ multi-index”还有其他问题,但是我不知道他们是否/如何帮助我解决这个问题。

import pandas as pd
import numpy as np

df= pd.DataFrame()
month = np.arange(1, 13)
values1 = np.random.randint(0, 100, 12)
values2 = np.random.randint(200, 300, 12)


df['month'] = np.hstack((month, month))
df['year'] = 2004
df['value'] = np.hstack((values1, values2))
df['item'] = np.hstack((np.repeat('item 1', 12), np.repeat('item 2', 12)))

# This doesn't work: 
# ValueError: Wrong number of items passed 24, placement implies 2
# mypiv = df.pivot(['year', 'month'], 'item', 'value')

# This doesn't work, either:
# df.set_index(['year', 'month'], inplace=True)
# ValueError: cannot label index with a null key
# mypiv = df.pivot(columns='item', values='value')

# This below works but is not ideal: 
# I have to first concatenate then separate the fields I need
df['new field'] = df['year'] * 100 + df['month']

mypiv = df.pivot('new field', 'item', 'value').reset_index()
mypiv['year'] = mypiv['new field'].apply( lambda x: int(x) / 100)  
mypiv['month'] = mypiv['new field'] % 100

问题答案:

您可以分组然后再堆叠。

>>> df.groupby(['year', 'month', 'item'])['value'].sum().unstack('item')
item        item 1  item 2
year month                
2004 1          33     250
     2          44     224
     3          41     268
     4          29     232
     5          57     252
     6          61     255
     7          28     254
     8          15     229
     9          29     258
     10         49     207
     11         36     254
     12         23     209

或使用pivot_table

>>> df.pivot_table(
        values='value', 
        index=['year', 'month'], 
        columns='item', 
        aggfunc=np.sum)
item        item 1  item 2
year month                
2004 1          33     250
     2          44     224
     3          41     268
     4          29     232
     5          57     252
     6          61     255
     7          28     254
     8          15     229
     9          29     258
     10         49     207
     11         36     254
     12         23     209


 类似资料:
  • 问题内容: 以下是我的数据框。我进行了一些转换以创建类别列,并删除了其所属的原始列。现在,我需要进行分组,以除去公母,并且可以通过总和来汇总。 这是我创建数据框时创建的索引 我假设我想删除索引,并创建日期和类别,然后对指标进行求和。如何在熊猫数据框中执行此操作? 在Ubuntu 12.04上,Python为2.7,熊猫为0.7.0。下面是我运行以下命令时遇到的错误 问题答案: 您可以在现有数据框上

  • 问题内容: 使用以下DataFrame,如何在不让Pandas将移位后的值分配给其他索引值的情况下基于索引来移位“ beyer”列? 生产… 问题在于,佩恩特得到了分配最后一位战士的啤酒。相反,我希望它像这样… 问题答案: 使用应用转移到各组分别:(感谢Jeff指出这个简化) 如果您有一个多索引,则可以通过将一系列或级别名称传递给 参数来对多个级别进行分组。

  • 问题内容: 第一次尝试熊猫,我试图先按照索引对数据透视表进行排序,然后再对一系列值进行排序。 到目前为止,我已经尝试过: 按索引然后按值对数据透视表进行排序的正确方法是什么? 问题答案: 这是一个可以做您想要的解决方案: 结果将如下所示: 将其作为API方法内置到熊猫中会很好。虽然不确定应该是什么样。

  • 基于单个值/标签的切片 基于一个或多个级别的多个标签的切片 布尔条件和表达式的过滤 哪些方法适用于什么情况 为简单起见的假设: 输入数据表没有重复的索引键 下面的输入数据只有两个级别。(此处所示的大多数解决方案都概括为N个级别) 问题2b 我如何获得级别“二”中对应于“t”和“w”的所有值? 如何从检索横截面,即具有索引特定值的单行?具体来说,如何检索的横截面,由 如何选择与和相对应的两行?

  • 问题内容: 我在熊猫DataFrame中有一个从Yahoo提取的股市数据列表(请参见下面的格式)。该日期用作DataFrame中的索引。我想将数据(包括索引)写出到SQLite数据库中。 根据我对Pandas的write_frame代码的了解,它目前不支持编写index。我尝试使用to_records代替,但是遇到了Numpy 1.6.2和datetimes 的问题。现在,我尝试使用.itertu

  • 问题内容: 我有一个pandas-Dataframe并用于计算均值(例如每日或每月均值)。这是一个小例子。 我现在该如何绘制monthly_mean?如何管理将新创建的DataFrame的索引用作x轴?提前致谢。 问题答案: 您可以用来将索引变回一列: