【问题标题】:Multilevel Slicing Pandas DataFrame多级切片 Pandas DataFrame
【发布时间】:2017-08-22 14:04:03
【问题描述】:

我有 3 个数据帧:

import pandas as pd
df1 =  pd.DataFrame( np.random.randn(100,4), index = pd.date_range('1/1/2010', periods=100), columns = {"A", "B", "C", "D"}).T.sort_index()
df2 =  pd.DataFrame( np.random.randn(100,4), index = pd.date_range('1/1/2010', periods=100), columns = {"A", "B", "C", "D"}).T.sort_index()
df3 =  pd.DataFrame( np.random.randn(100,4), index = pd.date_range('1/1/2010', periods=100), columns = {"A", "B", "C", "D"}).T.sort_index()

我将它们连接起来创建一个具有多层次的 DataFrame:

df_c = pd.concat([df1, df2, df3], axis = 1, keys = ["df1", "df2", "df3"])

交换级别和排序:

df_c.columns = df_c.columns.swaplevel(0,1)
df_c = df_c.reindex_axis(sorted(df_c.columns), axis = 1)


ipdb> df_c
    2010-01-01                     2010-01-02
     df1       df2       df3        df1       df2       df3
A  -0.798407  0.124091  0.271089   0.754759 -0.575769  1.501942
B   0.602091 -0.415828  0.152780   0.530525  0.118447  0.057240
C  -0.440619 -1.074837 -0.618084   0.627520 -1.298814  1.029443
D  -0.242851 -0.738948 -1.312393   0.559021  0.196936 -1.074277

我想对它进行切片以获取单个行的值,但到目前为止我只实现了这样程度的切片:

cols = df_c.T.index.get_level_values(0)

ipdb> df_c.xs(cols[0], axis = 1, level = 0)
        df1       df2       df3
A -0.798407  0.124091  0.271089
B  0.602091 -0.415828  0.152780
C -0.440619 -1.074837 -0.618084
D -0.242851 -0.738948 -1.312393

我发现获取每个原始值的唯一方法是定义一个新的数据框,

   slcd_df = df_c.xs(cols[0], axis = 1, level = 0)

然后使用通常的程序选择行:

  ipdb> slcd_df.ix["A", :]
  df1   -0.798407
  df2    0.124091
  df3    0.271089

但我想知道是否存在更好(意味着更快、更优雅)的方式来分割多级数据帧。

【问题讨论】:

标签: python pandas dataframe multi-index


【解决方案1】:

你可以使用pd.IndexSlice:

idx = pd.IndexSlice
sliced = df_c.loc["A", idx["2010-01-01", :]]
print(sliced)

2010-01-01  df1    0.199332
            df2    0.887018
            df3   -0.346778
Name: A, dtype: float64

或者你也可以使用slice(None):

print(df_c.loc["A", ("2010-01-01", slice(None))])

2010-01-01  df1    0.199332
            df2    0.887018
            df3   -0.346778
Name: A, dtype: float64

【讨论】:

  • 你的解决方案更好,但是 python 抛出一个错误,说索引必须是完全 lexsorted
  • 是的,这是索引未排序时的常见错误。它适用于此处使用的虚拟数据,但可能无法处理您的实际数据,对吧?按照here 的描述使用sort_index
  • 没错。我已经对数据进行了排序并删除了一些重复的值,但错误仍然存​​在。无论如何,谢谢你的回答!
  • 你用过df.sort_index(axis=1)吗?您想在此处对列进行排序。 sort_index 的默认值是行。
  • 是的,是的,我记得我曾经遇到过这个问题。问题是我无法对子级别(在本例中为 df1、df2、df3)进行排序。就我而言,我有更多的子级别(count、rank3、rank5、rank10),但我从来没有弄清楚如何对它们进行排序
猜你喜欢
  • 2013-09-01
  • 2017-03-28
  • 2012-08-06
  • 2017-12-11
  • 2014-05-24
  • 1970-01-01
  • 2020-12-08
  • 2021-11-22
相关资源
最近更新 更多