使用 .groupby() 后重命名列的问题

Posted

技术标签:

【中文标题】使用 .groupby() 后重命名列的问题【英文标题】:Issue with renaming columns after using .groupby() 【发布时间】:2021-12-23 10:40:41 【问题描述】:

我有一个这样的 df:

parent child
Susie jose
Susie bob
Susie bob
Susie frank
Allen bob
Allen frank

我希望它看起来像这样:

Parent child_jose child_bob child_frank
Susie 1 2 1
Allen 0 1 1

只计算父母拥有的每个孩子的数量,并为该孩子创建一个列,其中包含每个父母拥有多少孩子的数量

我使用此代码首先按父名称分组:

''' by_parent = df.groupby(["ParentName", "ChildName"])['ChildName'].count().to_frame() '''

当我得到输出时,这看起来正确,除了计数列名为“ChildName”。

所以在这段代码之后它看起来像

ParentName ChildName ChildName
Susie jose 1
bob 2
frank 1
Allen bob 1
frank 1
jose 0

我在这里尝试了一些类似的解决方案,但我没有运气直接获得列名。使用 to_frame() 后它看起来正确,但是当我调用 df.columns 时,只显示“ChildName”。任何有关如何降低第一步以及可能有助于从 childName 列中转出的帮助都将非常有帮助。提前致谢,如果您需要进一步说明,请发表评论。

【问题讨论】:

【参考方案1】:

好吧,只是为了展示另一种方法,因为很明显这里还有其他更好的答案。

您可以按父项和子项对数据进行分组,然后可以迭代原始数据框并创建所需的列。使用 get_group() + count() 方法,您可以获得该特定组的计数。

grouped_data = df.groupby(['parent', 'child'])['child']
for _, row in df.iterrows():
  df.loc[(df['parent'] == row.parent) & (df['child'] == row.child),
         f'child_row.child'] = grouped_data.get_group((row.parent, row.child)).count()

此时,您的数据框如下所示:

parent child child_jose child_bob child_frank
0 Susie jose 1.0 NaN NaN
1 Susie bob NaN 2.0 NaN
2 Susie bob NaN 2.0 NaN
3 Susie frank NaN NaN 1.0
4 Allen bob NaN 1.0 NaN
5 Allen frank NaN NaN 1.0

最后,我们删除child列,删除重复项,并按parent分组得到sum()

df = df.drop_duplicates().drop(columns='child')
df = df.groupby(['parent']).sum().reset_index()

输出:

parent child_jose child_bob child_frank
0 Allen 0.0 1.0 1.0
1 Susie 1.0 2.0 1.0

【讨论】:

【参考方案2】:

crosstab 在这里也不错,虽然它更像是一个方便的工具(根据数据集的大小可能会很慢):

(pd.crosstab(df.parent, df.child)
   .add_prefix('child_')
   .reset_index()
   .rename_axis(columns=None)
 )
  parent  child_bob  child_frank  child_jose
0  Allen          1            1           0
1  Susie          2            1           1

【讨论】:

这是crosstab 的完美用例:+10【参考方案3】:

groupby_count 之后使用unstack

>>> df.groupby(["parent", "child"])['child'].count().unstack() \
      .add_prefix('child_').rename_axis(index=None, columns=None) \
      .fillna(0).astype(int)

        child_bob  child_frank  child_jose
Allen           1            1           0
Susie           2            1           1

【讨论】:

以上是关于使用 .groupby() 后重命名列的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中合并数据后重命名列

熊猫重命名列

如何使用 Visual Studio 数据库项目重命名列?

使用 DACPAC,当表上有触发器时,如何重命名列?

Visual Studio 数据库项目重命名列

Python Pandas 合并(和连接)是不是无法通过后缀参数重命名列?