Groupby,转置每个组并乘以熊猫数据帧中的原始组

时间:2019-12-20 11:03:24

标签: python pandas numpy dataframe

我正在使用Python熊猫执行以下操作。我有一个F列和r行的数据框。此数据框中的所有字段均为数字。一列表示每一行所属的组。例如:

df = pd.DataFrame({'group': [1, 2, 1, 0, 0, 0, 1, 2],
            'A': [1.5, 0.5, 2.5, 0.5, 1.5, 0.5, 1.5, 0.5],
            'B': [3.5, 2.5, 3.5, 2.5, 3.5, 2.5, 3.5, 2.5]})

对于每个小组,我需要:

  1. 找到该组中每列的平均值,然后从每个元素中减去平均值
normalised_df = df.groupby(['group'], group_keys=True, axis=0).apply(lambda x: x - np.mean(x))

     group         A         B
0        1 -0.333333  0.000000
1        2  0.000000  0.000000
2        1  0.666667  0.000000
3        0 -0.333333 -0.333333
4        0  0.666667  0.666667
5        0 -0.333333 -0.333333
6        1 -0.333333  0.000000
7        2  0.000000  0.000000
  1. 对每个组进行转置并将其自身相乘(这样我就得到了每个组尺寸为FxF的矩阵)

例如第0组:

Group 0 transposed:
[-0.333333 0.666667 -0.333333
-0.333333 0.666667 -0.333333]

multiplied by itself:
[-0.333333 -0.333333
 0.666667  0.666667
-0.333333 -0.333333]

to give a 2x2 matrix

[0.666 0.666
 0.666 0.666]

  1. 将每个组中的所有FxF矩阵加到一个。

对于步骤2,我尝试了 transposed_df = df.groupby(['group']).apply(lambda x: np.transpose(x)*x) 哪些错误是因为形状未对齐(按预期)。

预期结果将是一个大小为F乘F的矩阵。它可以是一个numpy矩阵(因为这将更适合而不是数据框)。以上述数字为例,

[1.3333 0.6666
    0.6666 0.6666]

关于如何执行此操作的任何建议?

2 个答案:

答案 0 :(得分:3)

如果可能要进行矩阵乘法,请使用h运算符,并在@的第二级上每秒使用sum

MultiIndex

答案 1 :(得分:0)

您可以使用df.T转置数据框

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.transpose.html

您可以使用df.dot将数据框与另一个数据框点积。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dot.html

您可以使用df.mul将一个数据框与另一个数据框进行矩阵乘(元素乘)

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.mul.html