【问题标题】:Issue with renaming columns after using .groupby()使用 .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 列中转出的帮助都将非常有帮助。提前致谢,如果您需要进一步说明,请发表评论。

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2017-03-28
        • 2020-06-22
        • 2018-07-28
        • 2021-02-24
        • 1970-01-01
        • 2013-10-31
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        相关资源
        最近更新 更多