【发布时间】:2019-12-20 11:03:24
【问题描述】:
我正在使用 Python pandas 执行以下操作。我有一个包含 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]})
对于每个组我需要:
- 求该组中每一列的平均值,然后从每个元素中减去平均值
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
- 转置每个组并将其与自身相乘(这样我就得到了每个组的维度为 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]
- 将每组中的所有 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]
关于如何执行此操作的任何建议?
【问题讨论】:
-
你能添加最终预期的数据框吗?
-
@anky_91 我已经添加了预期的结果。我相信 numpy 矩阵会比数据框更适合,但如果你有更好的建议,我不喜欢它。
标签: python pandas numpy dataframe