使用熊猫如何在定义组名称时对相似和不相似的部分列值进行分组

时间:2018-10-20 01:49:31

标签: python pandas-groupby

因此,尝试对费用数据进行一些分析。导入了一个csv,最初的groupby是:

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

我注意到一些供应商使用略有不同的名称,并希望将它们合并为整体分组的一部分。匹配的文本在“谁”字段中并不总是位于同一位置,并且至少在到目前为止,我发现“谁”中的分组依据的术语根本不相似(“ Rathbone”和“ Yering”站”。

                                       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')

我想要的输出:

                                       Who   Amount
0   DE BORTOLI WINES          DIXONS CREEK  -163.54  # all rows containing 'De Bortoli'
1     Ezard@Levantine Hill      Coldstream  -52.40   # all rows containing 'Ezard@'
2  RATHBONE WINE GROUP       PORT MELBOURN  -20.20   # all rows containing 'Rathbone' or 'Yering Station' 
columns: Index(['Who', 'Amount'], dtype='object')

我一直在研究熊猫文档,网站示例和堆栈交换,但我无法找到一种不会引发某种错误的解决方案。

我希望能够在可能的情况下指定组“谁”(我认为这使这个问题与我所看到的其他示例有所不同)。

我还想知道是否应该全部通过一两个步骤-即两次通过是在数据帧上进行初始通用分组,然后将变体连接到groupby输出上。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

一种方法是创建一个字典,其中包含诸如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)

样本输出

                                    strat  Amount
0  DE BORTOLI WINES          DIXONS CREEK -163.54
1    Ezard@Levantine Hill      Coldstream  -52.40
2                     RATHBONE AND YERING  -68.25