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