标签: multi-index

在新的多索引级别下连接Pandas列

给出一个数据帧字典,如:

dict = {'ABC': df1, 'XYZ' : df2}   # of any length...
Run Code Online (Sandbox Code Playgroud)

其中每个数据框具有相同的列和相似的索引,例如:

data           Open     High      Low    Close   Volume
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149
Run Code Online (Sandbox Code Playgroud)

将所有数据帧合并为一个的最简单方法是什么,使用多索引,如:

symbol         ABC                                       XYZ
data           Open     High      Low    Close   Volume  Open ...
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  ...
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  ...
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  ...
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些方法 - 例如,对于每个数据帧,用多索引替换列.from_product(['ABC', columns])然后连接axis=1,但没有成功.

python multi-index pandas

46
推荐指数
2
解决办法
2万
查看次数

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

我想在熊猫上运行一个轴DataFrame,索引是两列,而不是一列.例如,年份的一个字段,月份的一个字段,显示"项目1"和"项目2"的"项目"字段和带有数值的"值"字段.我希望索引是年+月.

我设法让这个工作的唯一方法是将两个字段合并为一个,然后再将它们分开.有没有更好的办法?

下面复制的最小代码.非常感谢!

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) …
Run Code Online (Sandbox Code Playgroud)

python pivot multi-index pandas

40
推荐指数
2
解决办法
4万
查看次数

嵌套字典到多索引数据框,其中字典键是列标签

假设我有一个如下所示的字典:

dictionary = {'A' : {'a': [1,2,3,4,5],
                     'b': [6,7,8,9,1]},

              'B' : {'a': [2,3,4,5,6],
                     'b': [7,8,9,1,2]}}
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来像这样的数据帧:

     A   B
     a b a b
  0  1 6 2 7
  1  2 7 3 8
  2  3 8 4 9
  3  4 9 5 1
  4  5 1 6 2
Run Code Online (Sandbox Code Playgroud)

有没有方便的方法来做到这一点?如果我尝试:

In [99]:

DataFrame(dictionary)

Out[99]:
     A               B
a   [1, 2, 3, 4, 5] [2, 3, 4, 5, 6]
b   [6, 7, 8, 9, 1] [7, 8, 9, 1, 2]
Run Code Online (Sandbox Code Playgroud)

我得到一个数据框,其中每个元素都是一个列表.我需要的是一个多索引,其中每个级别对应于嵌套字典中的键和对应于列表中每个元素的行,如上所示.我想我可以做一个非常粗糙的解决方案,但我希望可能会有一些更简单的东西.

python dictionary multi-index dataframe pandas

36
推荐指数
3
解决办法
2万
查看次数

熊猫多指数的好处?

所以我了解到我可以使用DataFrame.groupby而无需使用MultiIndex进行子采样/横截面.

另一方面,当我在DataFrame上有MultiIndex时,我仍然需要使用DataFrame.groupby来进行子采样/横截面.

那么除了在打印时非常有用且漂亮的层次结构显示之外,什么是MultiIndex?

python multi-index pandas

34
推荐指数
2
解决办法
2万
查看次数

使用复合(分层)索引从Pandas数据框中选择行

我怀疑这是微不足道的,但我还没有发现让我根据分层键的值从Pandas数据帧中选择行的咒语.因此,例如,假设我们有以下数据帧:

import pandas
df = pandas.DataFrame({'group1': ['a','a','a','b','b','b'],
                       'group2': ['c','c','d','d','d','e'],
                       'value1': [1.1,2,3,4,5,6],
                       'value2': [7.1,8,9,10,11,12]
})
df = df.set_index(['group1', 'group2'])
Run Code Online (Sandbox Code Playgroud)

看起来像我们期望的那样:

在此输入图像描述

如果df未在group1上编入索引,我可以执行以下操作:

df['group1' == 'a']
Run Code Online (Sandbox Code Playgroud)

但是这个带有索引的数据帧失败了.所以也许我应该把它想象成一个带有分层索引的Pandas系列:

df['a','c']
Run Code Online (Sandbox Code Playgroud)

不.那也失败了.

那么如何选择所有行:

  1. group1 =='a'
  2. group1 =='a'&group2 =='c'
  3. group2 =='c'
  4. group1 in ['a','b','c']

python multi-index dataframe pandas

33
推荐指数
2
解决办法
3万
查看次数

如何在多个groupby之后将pandas数据从索引移动到列

我有以下pandas数据帧:

dfalph.head()

token    year    uses  books
  386   xanthos  1830    3     3
  387   xanthos  1840    1     1
  388   xanthos  1840    2     2
  389   xanthos  1868    2     2
  390   xanthos  1875    1     1
Run Code Online (Sandbox Code Playgroud)

我使用重复令牌聚合行,并且如下所示:

dfalph = dfalph[['token','year','uses','books']].groupby(['token', 'year']).agg([np.sum])
dfalph.columns = dfalph.columns.droplevel(1)
dfalph.head()

               uses  books
token    year       
xanthos  1830    3     3
         1840    3     3
         1867    2     2
         1868    2     2
         1875    1     1
Run Code Online (Sandbox Code Playgroud)

我没有在索引中使用'token'和'year'字段,而是希望将它们返回到列并具有整数索引.

python multi-index pandas pandas-groupby

33
推荐指数
2
解决办法
3万
查看次数

更改pandas中日期时间列的时区并添加为分层索引

我的数据带有UTC时间戳.我想将此时间戳的时区转换为"US/Pacific",并将其作为分层索引添加到pandas DataFrame中.我已经能够将时间戳转换为索引,但是当我尝试将其添加回DataFrame时,它会丢失时区格式,无论是作为列还是作为索引.

>>> import pandas as pd
>>> dat = pd.DataFrame({'label':['a', 'a', 'a', 'b', 'b', 'b'], 'datetime':['2011-07-19 07:00:00', '2011-07-19 08:00:00', '2011-07-19 09:00:00', '2011-07-19 07:00:00', '2011-07-19 08:00:00', '2011-07-19 09:00:00'], 'value':range(6)})
>>> dat.dtypes
#datetime    object
#label       object
#value        int64
#dtype: object
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试直接转换系列,我会遇到错误.

>>> times = pd.to_datetime(dat['datetime'])
>>> times.tz_localize('UTC')
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#  File "/Users/erikshilts/workspace/schedule-detection/python/pysched/env/lib/python2.7/site-packages/pandas/core/series.py", line 3170, in tz_localize
#    raise Exception('Cannot tz-localize non-time series')
#Exception: Cannot tz-localize non-time series
Run Code Online (Sandbox Code Playgroud)

如果我将其转换为索引,那么我可以将其作为时间序列进行操作.请注意,索引现在具有太平洋时区.

>>> times_index = …
Run Code Online (Sandbox Code Playgroud)

python timezone multi-index dataframe pandas

30
推荐指数
2
解决办法
4万
查看次数

在pandas中使用.loc和MultiIndex?

有谁知道是否可以使用DataFrame.loc方法从MultiIndex中进行选择?我有以下的数据帧,并希望能够访问位于"暂停"列中的值,在指数('at', 1),('at', 3),('at', 5),等(非连续).

我希望能够做data.loc[['at',[1,3,5]], 'Dwell']类似于data.loc[[1,3,5], 'Dwell']常规索引(返回3个成员的Dwell值系列)的语法.

我的目的是选择数据的任意子集,仅对该子集执行一些分析,然后使用分析结果更新新值.我打算使用相同的语法为这些数据设置新值,因此链接选择器在这种情况下不会真正起作用.

这是我正在使用的DataFrame的一部分:

         Char    Dwell  Flight  ND_Offset  Offset
QGram                                                           
at    0     a      100     120   0.000000       0  
      1     t      180       0   0.108363       5  
      2     a      100     120   0.000000       0 
      3     t      180       0   0.108363       5 
      4     a       20     180   0.000000       0  
      5     t       80     120   0.108363       5
      6     a       20     180   0.000000       0   
      7     t       80     120   0.108363       5  
      8     a       20     180   0.000000       0 …
Run Code Online (Sandbox Code Playgroud)

python multi-index dataframe pandas

30
推荐指数
3
解决办法
3万
查看次数

在熊猫系列中总结多指数水平

在python中使用Pandas包,我想在一个系列中使用3级多索引对一个级别进行求和(边缘化)以生成具有2级多索引的系列.例如,如果我有以下内容:

ind = [tuple(x) for x in ['ABC', 'ABc', 'AbC', 'Abc', 'aBC', 'aBc', 'abC', 'abc']]
mi = pd.MultiIndex.from_tuples(ind)
data = pd.Series([264, 13, 29, 8, 152, 7, 15, 1], index=mi)

A  B  C    264
      c     13
   b  C     29
      c      8
a  B  C    152
      c      7
   b  C     15
      c      1
Run Code Online (Sandbox Code Playgroud)

我想总结变量C以产生以下输出:

A  B    277
   b     37
a  B    159
   b     16
Run Code Online (Sandbox Code Playgroud)

熊猫做这件事的最佳方式是什么?

python statistics multi-index pandas

30
推荐指数
1
解决办法
2万
查看次数

具有多索引列的Pandas数据框 - 合并级别

我有一个数据框,有多grouped索引列,如下所示:

import pandas as pd
codes = ["one","two","three"];
colours = ["black", "white"];
textures = ["soft", "hard"];
N= 100 # length of the dataframe
df = pd.DataFrame({ 'id' : range(1,N+1),
                    'weeks_elapsed' : [random.choice(range(1,25)) for i in range(1,N+1)],
                    'code' : [random.choice(codes) for i in range(1,N+1)],
                    'colour': [random.choice(colours) for i in range(1,N+1)],
                    'texture': [random.choice(textures) for i in range(1,N+1)],
                    'size': [random.randint(1,100) for i in range(1,N+1)],
                    'scaled_size': [random.randint(100,1000) for i in range(1,N+1)]
                   },  columns= ['id', 'weeks_elapsed', 'code','colour', 'texture', 'size', 'scaled_size'])
grouped = df.groupby(['code', …
Run Code Online (Sandbox Code Playgroud)

python multi-index pandas

29
推荐指数
4
解决办法
2万
查看次数