Python 冗余多指标

Python 冗余多指标,python,python-3.x,pandas,python-3.6,Python,Python 3.x,Pandas,Python 3.6,我已经编写了一些函数来帮助聚合数据。最后,他们给了我想要的,但有一个疯狂的多索引系列: fec988a2-6eba-49e0-8327-a89f25143ccf fec988a2-6eba-49e0-8327-a89f25143ccf com.facebook.katana fec988a2-6eba-49e0-8327-a89f25143ccf 1067

我已经编写了一些函数来帮助聚合数据。最后,他们给了我想要的,但有一个疯狂的多索引系列:

fec988a2-6eba-49e0-8327-a89f25143ccf  fec988a2-6eba-49e0-8327-a89f25143ccf  com.facebook.katana                  fec988a2-6eba-49e0-8327-a89f25143ccf    1067
                                                                            com.android.systemui                 fec988a2-6eba-49e0-8327-a89f25143ccf     935
                                                                            com.facebook.orca                    fec988a2-6eba-49e0-8327-a89f25143ccf     893
                                                                            com.android.chrome                   fec988a2-6eba-49e0-8327-a89f25143ccf     739
                                                                            com.whatsapp                         fec988a2-6eba-49e0-8327-a89f25143ccf     515
我只需要第一个索引,以及一个带有应用程序名称(当然还有值)的索引。如何消除这样不必要的索引?

您可以使用双优先删除不必要的级别(此处仅为
2
,因为在删除另一个中
group\u keys=False
),然后使用
name='new'
Series
转换为
DataFrame
并设置新列名:

df = pd.DataFrame({'application':list('abbddedcc'),
                   'id':list('aaabbbbbb')})

print (df)
  application id
0           a  a
1           b  a
2           b  a
3           d  b
4           d  b
5           e  b
6           d  b
7           c  b
8           c  b

或者从第一个
groupby
中删除
id
,而不是测试相同的输出是否具有真实数据:

top = 2
df1 = (df.groupby(['application'])['id']
        .value_counts()
        .groupby(['id'], group_keys=False)
        .nlargest(top)
        .reset_index(name='new'))
print (df1)
  application id  new
0           b  a    2
1           a  a    1
2           d  b    3
3           c  b    2

可以将pd.DataFrame.reset_index()或pd.Series.reset_index()与drop=True参数一起使用:

n = 5
df = pd.DataFrame({'idx0': [0] * n, 'idx1': range(n, 0, -1), 
                   'idx2': range(0, n), 'idx3': ['a'] * n,
                    'value': [i/2 for i in range(n)]},
                  ).set_index(['idx0', 'idx1', 'idx2',  'idx3'])

df
Out:                     
idx0    idx1    idx2    idx3  value
0       5       0       a     0.0
        4       1       a     0.5
        3       2       a     1.0
        2       3       a     1.5
        1       4       a     2.0 

df.reset_index(level=(1, 3), drop=True)

Out:          
idx0    idx2    value
0       0       0.0
        1       0.5
        2       1.0
        3       1.5
        4       2.0

您是否认为
df=df.reset_index(level=[0,1]).reset_index()
?如果您有一个多索引,那么您可以使用函数
droplevel
。有关文档,请参阅。@jezrael:“ValueError:无法插入id,已经存在”@Inkidu616-然后使用
df=df.reset_index(级别=[0,1])。重命名_轴(['a','b'])。reset_index()
。顺便问一下,这些问题使用了什么代码?也许解决方案应该是更改此代码。@jezrael:同样的问题(第一个重置索引就是导致它的原因)。我无意中用这行代码创建了冗余索引:
df.groupby(['id',application'])['id'].value_counts().groupby(['id']).nlagest(top)
可以在
中重置索引,而len(df.index)>1
?@ghasmnadaf-这取决于需要;)显然是的,如果要将
多索引
转换为列。如果想将
索引
转换为列,可以使用
.reset_index()
默认值
索引
,例如,使用
df=pd.DataFrame({'A':['A','A','A'],'B':list(范围(3))
df=df.reset_index()
Sweet对我完全有帮助。谢谢谢谢问题是有些索引具有相同的名称(id),所以我在尝试除去其中一个之外的所有索引时出错。正如@jezrael所指出的,通过向groupby函数添加'group_keys=False'参数来解决这个问题。
n = 5
df = pd.DataFrame({'idx0': [0] * n, 'idx1': range(n, 0, -1), 
                   'idx2': range(0, n), 'idx3': ['a'] * n,
                    'value': [i/2 for i in range(n)]},
                  ).set_index(['idx0', 'idx1', 'idx2',  'idx3'])

df
Out:                     
idx0    idx1    idx2    idx3  value
0       5       0       a     0.0
        4       1       a     0.5
        3       2       a     1.0
        2       3       a     1.5
        1       4       a     2.0 

df.reset_index(level=(1, 3), drop=True)

Out:          
idx0    idx2    value
0       0       0.0
        1       0.5
        2       1.0
        3       1.5
        4       2.0