Python pandas:使用方法链接将列添加到分组的 DataFrame

Posted

技术标签:

【中文标题】Python pandas:使用方法链接将列添加到分组的 DataFrame【英文标题】:Python pandas: Add column to grouped DataFrame with method chaining 【发布时间】:2016-09-05 15:17:49 【问题描述】:

首先让我说我是熊猫新手。

我正在尝试在 DataFrame 中创建一个新列。我能够做到这一点,如我的示例所示。但我想通过链接方法来做到这一点,所以我不必分配新变量。让我先展示一下我想要实现的目标,以及到目前为止我做了什么:

In [1]:
import numpy as np
from pandas import Series,DataFrame
import pandas as pd

In [2]:
np.random.seed(10)
df=pd.DataFrame(np.random.randint(1,5,size=(10, 3)), columns=list('ABC'))
df

Out [2]:
A  B  C
2  2  1
4  1  2
4  1  2
2  1  2
2  3  1
2  1  3
1  3  1
4  1  1
4  4  3
1  4  3
In [3]:
filtered_DF = df[df['B']<2].copy()
grouped_DF = filtered_DF.groupby('A')
filtered_DF['C_Share_By_Group'] =filtered_DF.C.div(grouped_DF.C.transform("sum"))
filtered_DF

Out [3]:
A  B  C  C_Share_By_Group
4  1  2               0.4
4  1  2               0.4
2  1  2               0.4
2  1  3               0.6
4  1  1               0.2

我想通过链接方法来达到同样的目的。在带有 dplyr 包的 R 中,我可以执行以下操作:

df %>% 
  filter(B<2) %>%
  group_by(A) %>% 
  mutate('C_Share_By_Group'=C/sum(C))

在pandas documentation 中它说R(dplyr) 中的mutate 等于pandas 中的assign,但assign 不适用于分组对象。 当我尝试将某些内容分配给分组数据框时,出现错误:

“AttributeError: 无法访问‘DataFrameGroupBy’对象的可调用属性‘assign’,尝试使用‘apply’方法”

我尝试了以下方法,但不知道如何添加新列,或者是否可以通过链接方法来实现:

(df.loc[df.B<2]
   .groupby('A')
    #****WHAT GOES HERE?**** apply(something)?
)

【问题讨论】:

欢迎来到从函数式编程到命令式编程的悲伤世界。您可以在 Python 中使用转换 【参考方案1】:

你可以试试assign:

print df[df['B']<2].assign(C_Share_By_Group=lambda df: 
                       df.C
                         .div(df.groupby('A')
                           .C
                           .transform("sum")))

   A  B  C  C_Share_By_Group
1  4  1  2               0.4
2  4  1  2               0.4
3  2  1  2               0.4
5  2  1  3               0.6
7  4  1  1               0.2

【讨论】:

感谢您的尝试。我只是不认为这真的是我正在寻找的答案。方法链接的优点之一是,您不必做两次事情,因为您正在传递方法的输出。在您的方法中,您将过滤相同的 DataFrame 三次(df['B']&lt;2])。 谢谢。您是对的,因此已编辑答案并删除了不必要的代码。请立即检查。 我尝试运行您的代码,但结果不等于我的代码。 C_Share_By_Group 0.250000 0.250000 0.285714 0.428571 0.125000 我想你忘了lambda 我会接受你的回答,尽管这不是我想要的。我想为了做我想做的事,必须将更多方法添加到 DataFrameGroupBy 类中。希望他们稍后会添加这些,就像他们使用 0.18.1 改进方法链接一样。

以上是关于Python pandas:使用方法链接将列添加到分组的 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

熊猫(python):如何将列添加到数据框以进行索引?

Pandas 基于连接将列从一个数据帧添加到另一个数据帧

将列添加到包含其他列值列表的 pandas DataFrame

Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来

Python/Pandas/Datetime:将列中的整个列表转换为日期时间

python 将列转换为pandas to_datetime()