使用 .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() 后重命名列的问题的主要内容,如果未能解决你的问题,请参考以下文章