Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要计算具有多索引的数据帧的中值_Python_Pandas_Dataframe_Multi Index - Fatal编程技术网

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

..然后还要更详细地解释它,这样所有人都可以从中学习,而不仅仅是代码转储。