当前位置: 首页 > 知识库问答 >
问题:

仅选择多索引数据帧的一个索引

施旭东
2023-03-14

我正在尝试从多索引数据帧中仅使用一个索引来创建新的数据帧。

                   A         B         C
first second                              
bar   one     0.895717  0.410835 -1.413681
      two     0.805244  0.813850  1.607920
baz   one    -1.206412  0.132003  1.024180
      two     2.565646 -0.827317  0.569605
foo   one     1.431256 -0.076467  0.875906
      two     1.340309 -1.187678 -2.211372
qux   one    -1.170299  1.130127  0.974466
      two    -0.226169 -1.436737 -2.006747

理想情况下,我想要这样的东西:

In: df.ix[level="first"]

和:

Out:

               A         B         C
first                               
bar        0.895717  0.410835 -1.413681
           0.805244  0.813850  1.607920
baz       -1.206412  0.132003  1.024180
           2.565646 -0.827317  0.569605
foo        1.431256 -0.076467  0.875906
           1.340309 -1.187678 -2.211372
qux       -1.170299  1.130127  0.974466
          -0.226169 -1.436737 -2.006747
`

基本上,我想删除除levelfirst之外的多索引的所有其他索引。有没有一个简单的方法可以做到这一点?

共有3个答案

路昆杰
2023-03-14

我使用get_level_值(0)来获取多索引组中的第一级索引,从而构建一个包含聚合值和编码值的描述字典值的数据帧。我通过以下方式获得组中“airline_enc”值的索引

def getAirlineByGrouped(grouped,dictGeneric):
    mylist=[]
    for key in grouped.index.get_level_values(0):
        item=dictGeneric.get(key)
        mylist.append(item)
    return mylist

encoder=LabelEncoder()
df['airline_enc']=encoder.fit_transform(df['airline'])

dictAirline=   df[['airline_enc','airline']].set_index('airline_enc').to_dict()
grouped=results.groupby(['airline_enc','rating'])['recommended'].count()

#print(grouped)
airlines=getAirlineByGrouped(grouped, dictAirline['airline'])

result_df=pd.DataFrame({'index': grouped.index.get_level_values(0),'value':grouped.values,'airline':airlines})
result_df.plot(x='airline',y='value')
plt.xticks(rotation=90)
龙嘉玉
2023-03-14

这个解决方案是相当新的,它使用df.xs函数作为

In [88]: df.xs('bar', level='first')
Out[88]:
Second  Third
one     A       -2.315312
        B        0.497769
        C        0.108523
two     A       -0.778303
        B       -1.555389
        C       -2.625022
dtype: float64

也可以做多个索引作为

In [89]: df.xs(('bar', 'A'), level=('First', 'Third'))
Out[89]:
Second
one   -2.315312
two   -0.778303
dtype: float64

示例的设置如下

import pandas as pd
import numpy as np
arrays = [
    np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
    np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])
]
index = pd.MultiIndex.from_tuples(list(zip(*arrays)), names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
df.index.names = pd.core.indexes.frozen.FrozenList(['First', 'Second', 'Third'])
df = df.unstack()
薛博艺
2023-03-14

一种方法可以是简单地将df.index重新绑定到所需的MultiIndex级别。您可以通过指定要保留的标签名称来完成此操作:

df.index = df.index.get_level_values('first')

或使用级别的整数值:

df.index = df.index.get_level_values(0)

MultiIndex的所有其他级别都将在这里消失。

 类似资料:
  • 问题内容: 我正在尝试仅使用来自多索引DataFrame的一个索引来创建新的DataFrame。 理想情况下,我想要这样的事情: 和: 本质上,我想删除除level之外的多索引的所有其他索引。是否有捷径可寻? 问题答案: 一种方法是简单地重新绑定到所需的MultiIndex级别。您可以通过指定要保留的标签名称来做到这一点: 或使用级别的整数值: MultiIndex的所有其他级别将在此处消失。

  • 我正在寻找一种简单的方法来选择熊猫数据框df中的特定值。 我的df行如下所示:编辑以使其更清晰 我的目标是选择每一行[1](df[索引])与一个新的索引。所以这是df.index0,8,以此类推... 是否有另一种可能的方法,而不是迭代整个df并检查行[1](df[索引])上的索引的更改? 我知道有一种方法可以像这样选择第n行:df.iloc[0::n,:]但是第[1]行上的索引更改(df[“in

  • 我有两个形状相同的python数据帧,例如: 我想使用df2中的值作为行索引来选择df1中的值,并创建一个形状相等的新数据帧。预期结果: 我已尝试使用.loc,它在单个列中运行良好: 但是我不能同时在所有列上使用. loc或. iloc。我想避免循环来优化性能,因为我正在处理一个大数据帧。有什么想法吗?

  • 我想知道是否可以从一个多索引级别中选择多个项目? 假设我有一个大熊猫数据帧,如下所示: 我想使用dataframe的lvl_2选择特定列 尝试类似< code>df.xs(['c ',' e'],level='lvl_2 ',axis=1)的内容会导致错误: 关键错误:“e”

  • 我正在尝试连接以下数据帧: df1 以及: df2 与 但是我得到了以下输出: 我已经删除了额外的列,删除了可能存在冲突的重复项和NA,但我只是不知道出了什么问题。

  • 我得到了一个具有多个列和行的数据帧df1。简单的例子: 我想创建一个空的数据框df2,然后再添加新的列和计算结果。 此时,我的代码如下所示: …添加两个新列: 有没有更好/更安全/更快的方法?是否可以创建一个空数据帧df2,并且只从df1复制索引?