Python 需要计算具有多索引的数据帧的中值
我有以下资料:Python 需要计算具有多索引的数据帧的中值,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我有以下资料: nmins mac status 3899255688923906615 problems_group_group 198 problems_individual 162 3929325397689943966 problems_group_group 198
nmins
mac status
3899255688923906615 problems_group_group 198
problems_individual 162
3929325397689943966 problems_group_group 198
problems_individual 117
4613397785779760382 problems_group_group 198
problems_individual 5
4861652328118504220 problems_group_group 198
problems_individual 1078
5035225657878165368 problems_group_group 198
problems_individual 140
9405388597739161436 problems_group_group 98
problems_individual 83
10100515225827442540 problems_group_group 198
problems_individual 106
11478610956449410394 problems_group_group 198
problems_individual 103
DataFrame具有以下结构:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 16 entries, (3899255688923906615, problems_group_group) to (11478610956449410394, problems_individual)
Data columns (total 1 columns):
nmins 16 non-null int64
dtypes: int64(1)
memory usage: 375.0+ bytes
多索引:16个条目(3899255688923906615,问题组)到(1147861095649410394,问题组)
数据列(共1列):
nmins 16非空int64
数据类型:int64(1)
内存使用:375.0+字节
我需要计算每个mac的“问题\个人/问题\组\组”比率,并计算整个数据帧的中值。“problems\u group\u group”字段可能等于0-这种情况我不需要包括在计算中。。。
我尝试过使用类似df.groupby('mac').transform()的东西,但不一定成功。。。
请告诉我怎么做…我似乎已经找到了解决方法:
xx = df.groupby('mac').apply(lambda o : 0 if (o.nmins[0] == 0) else o.nmins[1]/o.nmins[0])
xx[xx != 0].median()
好的,让我们创建一个类似于您的数据帧:
import pandas as pd
import numpy as np
iterables = [np.random.randint(10_000, 20_000, 100).astype(str), ["group", "individual"]]
index = pd.MultiIndex.from_product(iterables, names = ["address", "status"])
df = pd.DataFrame({"nmins" : np.random.randint(0, 200, len(index))}, index = index)
看起来是这样的:
nmins
address status
16541 group 173
individual 67
11304 group 70
individual 133
15086 group 69
... ...
10851 individual 178
14781 group 173
individual 186
12667 group 93
individual 44
现在我们可以使用pd.indexlice
来发挥一些魔力
我们将使用如下切片来分隔不同的组:
idx = pd.IndexSlice
individual = df.loc[idx[:, "individual"], "nmins"].values
group = df.loc[idx[:, "group"], "nmins"].values
最后,我们将条件称为numpy,其中
:以下代码表示,如果group
索引处的nmins
列不等于零,则以安全的方式执行个人/组
,否则执行0
xx = np.where(df.loc[idx[:,"group"], "nmins"].ne(0),
np.divide(individual,group, where = group!=0),
0)
然后,您可以使用以下方法找到中值:
np.median(xx[xx!0])
在这种情况下,从概念上讲,这可能需要更多的工作,但在更大的数据帧上,这将大大提高效率,这也有助于正确思考。IIUC,您可以尝试以下方法: 使用@NaturalFrequency设置:
import pandas as pd
import numpy as np
iterables = [np.random.randint(10_000, 20_000, 100).astype(str), ["group", "individual"]]
index = pd.MultiIndex.from_product(iterables, names = ["address", "status"])
df = pd.DataFrame({"nmins" : np.random.randint(0, 200, len(index))}, index = index)
df_out = df.median(level=1).T.eval('ratio = individual / group')
print(df_out)
输出:
status group individual ratio
nmins 97 99 1.020619
..然后还要更详细地解释它,这样所有人都可以从中学习,而不仅仅是代码转储。