【问题标题】:pandas aggregating columns with groupby axis=1 gives KeyError使用 groupby 轴 = 1 聚合列的 pandas 给出 KeyError
【发布时间】:2022-01-03 02:37:22
【问题描述】:

当我们提供axis=1 时,我对groupby 的行为感到困惑。例如:

from pandas import DataFrame
junk_df = DataFrame(data = {"c1": [1,1,2,2,3,3], 
                            "c2": [1,1,3,3,5,5], 
                            "c3": [2,2,3,3,4,4]}, 
                            index=["r1", "r2", "r3", "r3", "r5", "r6"])
print(junk_df)

    c1  c2  c3
r1   1   1   2
r2   1   1   2
r3   2   3   3
r3   2   3   3
r5   3   5   4
r6   3   5   4

现在是groupbyaxis=0

print(junk_df.groupby("c1", axis=0).mean())

通过c1 中的值给出预期的行聚合

    c2  c3
c1        
1    1   2
2    3   3
3    5   4

但是将groupby 切换到聚合列而不是行似乎会引发KeyError

print(junk_df.groupby("r1", axis=1).mean())

给予

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-30-f6b95242fc39> in <module>
----> 1 print(junk_df.groupby("r1", axis=1).mean())

~/opt/miniconda3/lib/python3.8/site-packages/pandas/core/frame.py in groupby(self, by, axis, level, as_index, sort, group_keys, squeeze, observed, dropna)
   6509         axis = self._get_axis_number(axis)
   6510 
-> 6511         return DataFrameGroupBy(
   6512             obj=self,
   6513             keys=by,

~/opt/miniconda3/lib/python3.8/site-packages/pandas/core/groupby/groupby.py in __init__(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, squeeze, observed, mutated, dropna)
    523             from pandas.core.groupby.grouper import get_grouper
    524 
--> 525             grouper, exclusions, obj = get_grouper(
    526                 obj,
    527                 keys,

~/opt/miniconda3/lib/python3.8/site-packages/pandas/core/groupby/grouper.py in get_grouper(obj, key, axis, level, sort, observed, mutated, validate, dropna)
    779                 in_axis, name, level, gpr = False, None, gpr, None
    780             else:
--> 781                 raise KeyError(gpr)
    782         elif isinstance(gpr, Grouper) and gpr.key is not None:
    783             # Add key to exclusions

KeyError: 'r1'

有人知道如何按行中的值聚合列吗?

【问题讨论】:

  • 你有两个r3 行。
  • junk_df.T.groupby("r1").mean()

标签: python pandas dataframe pandas-groupby keyerror


【解决方案1】:

axis=1 指的是列。 r1 不在列列表中,因此 KeyError

您可以使用 junk_df.T 转置(基本上旋转 90 度)数据框,因此列成为行,行成为列。然后groupby("r1") 就可以了。

>>> junk_df.T.groupby("r1", as_index=False).mean()
   r1   r2   r3   r3   r5   r6
0   1  1.0  2.5  2.5  4.0  4.0
1   2  2.0  3.0  3.0  4.0  4.0

然后你可以用另一个.T 翻转它:

>>> junk_df.T.groupby("r1", as_index=False).mean().T
      0    1
r1  1.0  2.0
r2  1.0  2.0
r3  2.5  3.0
r3  2.5  3.0
r5  4.0  4.0
r6  4.0  4.0

【讨论】:

    【解决方案2】:

    一种方法:

    res = junk_df.groupby(junk_df.loc["r1"], axis=1).mean()
    print(res)
    

    输出

    r1    1    2
    r1  1.0  2.0
    r2  1.0  2.0
    r3  2.5  3.0
    r3  2.5  3.0
    r5  4.0  4.0
    r6  4.0  4.0
    

    【讨论】:

    • 非常好stackoverflow.com/users/4001592/dani-mesejo。您已经演示了如何使用axis=1 执行groupby 聚合,这是我提出问题的基础。谢谢你。有趣的是,“幕后”.groupby 似乎对axis=0 隐含地暗示了你的建议,但对axis=1 却没有?请注意,您显式调用 .loc 的方法适用于 axis=1axis=0,但仅指定列名或行名无效。
    猜你喜欢
    • 2019-11-10
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2019-10-12
    • 2017-07-02
    • 2017-07-20
    • 2017-06-07
    相关资源
    最近更新 更多