熊猫冗余索引

时间:2018-08-16 08:18:20

标签: 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
                                                                            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 个答案:

答案 0 :(得分:1)

您可以使用双重reset_index-首先删除不必要的级别(此处仅private async void button_Click(object sender, EventArgs e) { ThirdParty.Stuff newStuff = new ThirdParty.Stuff(); //call some functions... var tcs = new TaskCompletionSource<int>(); int mode; newStuff.SetConfig += (_id, _mode, ex) => { if(!string.IsNullOrWhitespace(ex)) { tcs.TrySetException(new Exception(ex)); } else { mode = _mode; tcs.TrySetResult(_id); } } newStuff.SetConfig(5, 10); //call other functions... var id = await tcs.Task; Console.WriteLine("ID is " + id + " and this.Mode is " + mode); } ,因为groupby中的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 中删除id,而是测试是否有真实数据的相同输出:

groupby

答案 1 :(得分:1)

您可以将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