我写了一些函数来帮助汇总数据。最后,他们给了我我想要的东西,但是却带有疯狂的多索引系列:
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
我只需要第一个索引,以及一个带有应用程序名称(当然还有值)的索引。我该如何摆脱不需要的索引?
答案 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