【问题标题】:adding a grouped-by zscore column to a pandas dataframe将按 zscore 分组的列添加到 pandas 数据框
【发布时间】:2017-01-18 04:08:58
【问题描述】:

我可以将一列插入到数据框中,像这样对另一列进行 z 评分:

[1] df.insert(<loc>, column='ZofA', value=(df['A']-df['A'].mean())/df['A'].std())

我可以像这样对按其他 2 列分组的列进行简单的缩减:

[2] df.groupby(['C1', 'C2'])['A'].mean()

我尝试将 [2] 中的简单 mean() 函数替换为 [1] 中的 zscore 函数,但不知道该怎么做,包括使用 .apply ——例如这失败了:

[3] df.groupby(['C1', 'C2']).apply((df['A']-df['A'].mean())/df['A'].std())

所以我的第一个问题是我显然不知道如何创建带有分组的 zscore 列。

我的第二个问题是我想将 (1) 将新列插入到保存另一列 ('A') 的 z 分数的数据框 ('ZofA') 中,以及 (2) 计算这些 z 分数在由另外两个列('C1','C2')定义的组内。 (3) 我想在一个 df.insert() 语句中完成所有这些工作。我只是弄乱了括号和括号之类的东西,还是我试图在一个陈述中做太多事情?谢谢!

【问题讨论】:

标签: python-2.7 pandas dataframe


【解决方案1】:

感谢您提供指向文档的指针。对于任何好奇的人,我想我会发布解决方案。首先,将zscore计算放入一个lambda中:

zscore = lambda x: (x - x.mean()) / x.std()

神奇的成分是 .transform。只需像这样编写插入语句:

df.insert(<loc>, 'ZofA', df.groupby(['C1', 'C2'])['A'].transform(zscore))

解决方案确实在“Group By: split-apply-combine”文档中。您只需向下滚动大约一半到“转换”部分。我忽略了有关日期键的内容,只是将我的分组列直接插入到 groupby 语句中。

【讨论】:

  • 我还在学习pandas,但是&lt;loc&gt; 看起来不像是有效的python。它在做什么?
  • 你是对的。只需将 替换为表示您希望新列在数据框中的位置的整数。 '1' 将它放在当前第一列之前,'2' 将它放在第一列之后但在第二列之前,依此类推。无论插入新列的位置,其右侧的所有列都会向右移动一个位置.
猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 2019-11-07
  • 2014-07-22
  • 1970-01-01
  • 2021-05-03
  • 2013-10-29
  • 1970-01-01
  • 2022-09-18
相关资源
最近更新 更多