对于pandas,如何在定义组名时按相似和非相似的部分列值进行分组

2024-10-03 11:15:15 发布

您现在位置:Python中文网/ 问答频道 /正文

所以尝试对费用数据做一些分析。已导入csv,初始groupby为:

group_df = df.groupby('Who', as_index=False).sum()

我注意到一些供应商使用了稍微不同的名称,并希望将它们组合起来作为整体分组的一部分。在“Who”字段中,匹配文本的位置并不总是相同的,至少在一个案例中,我发现groupby在“Who”一点都不相似(“Rathbone”和“Yering Station”)。在

                                       Who   Amount
0   DE BORTOLI WINES          DIXONS CREEK  -29.54
1   DE BORTOLI WINES  RE      DIXONS CREEK  -20.50
2   DE BORTOLI WINES P/L      DIXONS CREEK  -22.50
3         DE BORTOLI WINES PTY L    BILBUL  -91.00
4     Ezard@Levantine Hill      Coldstream  -31.30
5     Ezard@LevantineHill       Coldstream  -21.10
6  RATHBONE WINE GROUP       PORT MELBOURN  -20.20
7     YERING STATION            YARRA GLEN  -17.05
8    YERING STATION            YARRA GREEN  -31.00
columns: Index(['Who', 'Amount'], dtype='object')

我想要的输出:

^{pr2}$

我已经看过了pandas文档、网站示例和堆栈交换,但我无法找到一个解决方案,即不抛出一种或另一种错误。在

如果可能的话,我希望能够指定组“Who”(我认为这使得这个问题与我见过的其他示例有点不同)。在

我还想知道是应该在一个过程中完成还是在两个过程中完成-即两个过程是对数据帧进行初始的泛型分组,然后在groupby输出上连接变量。在

我的方法是正确的吗-在尝试分组之前对数据帧行进行一些合并会更好吗?在

谢谢你的帮助!在


Tags: 数据df过程deamountgroupbystationwho
1条回答
网友
1楼 · 发布于 2024-10-03 11:15:15

一种方法是创建一个包含查找键的字典,如DE BORTOLI,并定义统一值,如DE BORTOLI WINES DIXONS CREEK。然后,您可以为此分层名称创建一个临时列,这样列Who中的信息不会丢失,并按新列分组:

#create dictionary how to translate patterns into categories
#the pattern .* is used as a regex pattern meaning any character before or after this string allowed
transl = {".*DE BORTOLI.*": "DE BORTOLI WINES          DIXONS CREEK", ".*Ezard@.*": "Ezard@Levantine Hill      Coldstream", ".*RATHBONE.*": "RATHBONE AND YERING", ".*YERING.*":"RATHBONE AND YERING"}
#create column with stratified name for grouping
df["strat"] = df["Who"].replace(to_replace = transl, regex = True)
#group and sum
group_df = df.groupby("strat", as_index = False).sum()
print(group_df)

样本输出

^{pr2}$

相关问题 更多 >