Skip to main content
 首页 » 编程设计

python之使用 Pandas DataFrame 将值放在组下方意味着

2025年05月04日52三少

我有一个包含多个索引的 DataFrame/Series。这是生成一个的代码:

index = pd.MultiIndex.from_product([['a', 'a', 'b', 'b'], ['c', 'c', 'd', 'd']], names=['first', 'second']) 
s = pd.Series(range(16), index=index) 

“s”变成:

In [139]: pd.Series(range(16), index=i2) 
Out[139]:  
first  second 
a      c          0 
       c          1 
       d          2 
       d          3 
       c          4 
       c          5 
       d          6 
       d          7 
b      c          8 
       c          9 
       d         10 
       d         11 
       c         12 
       c         13 
       d         14 
       d         15 
dtype: int64 

如何删除低于组均值的值(最初是组均值的 20%)?

In [140]: s.mean(level=[0,1]) 
Out[140]:  
first  second 
a      c          2.5 
       d          4.5 
b      c         10.5 
       d         12.5 
dtype: float64 

“愚蠢”的方法是循环遍历帧 (iterrows) 并逐一比较。必须有一种更聪明的 Pandas 方式,比如使用诸如应用/加入/等等之类的东西。 我对 Pandas 很陌生。

请您参考如下方法:

IIUC,你可以为此使用transform:

>>> s.loc[s >= s.groupby(level=[0,1]).transform("mean")] 
first  second 
a      c          4 
       c          5 
       d          6 
       d          7 
b      c         12 
       c         13 
       d         14 
       d         15 
dtype: int64 

transform 获取 groupby 缩减结果,此处为 mean,并将其扩展以匹配原始索引,这意味着我们可以使用它来创建 bool 掩码:

>>> s.groupby(level=[0,1]).transform("mean") 
first  second 
a      c          2.5 
       c          2.5 
       d          4.5 
       d          4.5 
       c          2.5 
[and so on] 
>>> s >= s.groupby(level=[0,1]).transform("mean") 
first  second 
a      c         False 
       c         False 
       d         False 
       d         False 
       c          True 
[and so on] 

我也可能会简单地编写 s.groupby(s.index).transform("mean"),但这更多的是偏好问题。