【问题标题】:Averages of DataFrame columns in PythonPython 中 DataFrame 列的平均值
【发布时间】:2021-12-24 05:31:51
【问题描述】:

由于我没有足够高的声誉,我无法对原始问题发表评论,但我参考了这个问题DataFrames - Average Columns,特别是这行代码:

dfgrp= df.iloc[:,2:].groupby((np.arange(len(df.iloc[:,2:].columns)) // 2) + 1, axis=1).mean().add_prefix('ColumnAVg')

当我读到它时,从第 2 列开始取出所有行,按相同行和列的长度分组某事某事在列上,而不是行上,获取这些列的平均值,然后添加到名为 ColumnAVg1/2/3 等的新列。

我也知道这取 1&2、3&4、5&6 等列的平均值,但我不知道它是怎么做的。

所以我的问题是,上面的代码需要改变什么来获得第 1&2、2&3、3&4、4&5 等列的平均值,结果格式相同?

【问题讨论】:

  • (np.arange(len(df.iloc[:,2:].columns)) // 2) + 1 为每一列提供了一个键,该键用于对列进行分组轴=1。所以这里基本上你的列标记为 [0, 0, 1, 1, 2, 2, ...]
  • 感谢@DaveQ,但这是我不明白的那部分代码。平均列 1&2、3&4 等是什么意思?那么我该如何改变它以给出 [1&2, 2&3, 3&4...] 的平均值 它的哪一部分给出了列 [0,0,1,1,2,2,...] - 这意味着什么?我怎么读?
  • 我只会给出一个答案,虽然可能不是一个很好的答案。

标签: python dataframe mean


【解决方案1】:
df     = pd.DataFrame(np.random.randn(2, 4), columns=['a', 'b', 'c', 'd'])
groups = [(1,2),(2,3),(2,3,4),(1,3)]
df2    = pd.DataFrame([df.iloc[:, i - 1] for z in groups for i in z]).T
labels = [str(z) for z in groups for _ in z]
result = df2.groupby(by=labels, axis=1).mean()

可能不是您想要的,但这样的东西应该可以工作。

【讨论】:

  • 太棒了!谢谢 DaveQ
【解决方案2】:

不幸的是,您无法更改该代码来获得结果,因为它通过为每一列分配一个数字并将它们组合在一起来实现它的功能。但是,您可以做一些厚脸皮的事情。只需提供 2 个分组,获取每个分组的平均值并将它们组合成一个帧。

df = pd.DataFrame(np.random.randn(2, 4), columns=['a', 'b', 'c', 'd'])

d1 = df.groupby((np.arange(len(df.columns)) // 2), axis=1).mean()
d2 = df.groupby((np.arange(len(df.columns) + 1) // 2)[1:], axis=1).mean()

dfo = pd.DataFrame()
for i in range(len(df.columns)-1):
    c = f'average_{df.columns[i]}_{df.columns[i+1]}'
    if i % 2 == 0:
        dfo[c] = d1[d1.columns[i / 2]]
    else:
        dfo[c] = d2[d2.columns[(i+1) / 2]]

他所做的是将列 1,2,3,4 分配给 1,1,2,2。所以在我们的代码中,我们根据 1,1,2,2 分配了 d1,根据 0,1,1,2 分配了 d2。 for循环就是把结果组合起来。

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2021-09-09
    • 2018-07-21
    • 2021-07-30
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2020-11-14
    相关资源
    最近更新 更多