冗余多重索引

2024-10-04 01:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我只需要第一个索引,和一个应用程序名(当然还有值)。我如何摆脱像这样不需要的索引?你知道吗


Tags: 数据函数com应用程序facebookchromeandroidwhatsapp
2条回答

您可以使用双^{}-首先删除不必要的级别(这里仅使用2,因为^{}中的group_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

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

或者从第一个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\u索引()或pd.Series.reset\u索引()带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

相关问题 更多 >