Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧的多级切片_Python_Pandas_Dataframe_Multi Index - Fatal编程技术网

Python 数据帧的多级切片

Python 数据帧的多级切片,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我有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', pe

我有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()
我将它们连接起来,创建具有多个级别的数据帧:

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抛出了一个错误,表示索引必须完全被排序,这是索引未排序时的常见错误。它在这里使用的虚拟数据上工作,但在实际数据上可能失败,对吗?按说明使用
排序索引
。准确无误。我已经对数据进行了排序并删除了一些重复的值,但错误仍然存在。无论如何,谢谢你的回答!您是否使用了df.sort\u索引(axis=1)?您想在此处对列进行排序。
sort\u index
的默认值是rows。是的,我记得我曾经遇到过这个问题。问题是我无法对子级别进行排序(本例中为df1、df2、df3)。在我的例子中,我有更多的子级别(count、rank3、rank5、rank10),但我从未想过如何对它们进行排序:
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
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