根据数据帧中具有不同长度前缀和不一致分隔符的列值中的公共前缀对数据进行分组和求和

2024-09-29 11:17:31 发布

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

我不熟悉使用Python和Pandas,但一直在尝试为我的报告自动化一些数据清理/合并。 到目前为止,我已经成功地建立了所有信息的组合文件,我需要将这些信息输入到我的报告摘要中,但是 无法使用匹配的前缀对数据进行分组和合并

我有一个数据集,其结构与pandas dataframe中的类似:

Company_Num     Company_Name                2019_Amt    2020_Amt    Code    Flag    Manager

1               ABC Company Ltd             2000        400         A       Y       John
1               ABC Company Ltd             2000        400         A       Y       John
2               DEFGHIJ Company (London)    480         100         B       N       James
3               DEFGHIJ Company (Bristol)   600         700         B       N       James
4               DEFGHIJ Company (York)      1500        1000        B       N       James       
5               KLM Services                9000        7000        A       Y       Jane   
6               NOPQ Industries             300         400         C       Y       Jen   
7               NOPQ Industries - London    7000        8000        C       Y       Jen      

我想得到一组数据摘要,其中数据和数据中没有重复项 我没有为每个办公室设置行,而是为每个公司设置一个汇总值。最终 使用数据帧,如:

Company_Name            2019_Amt    2020_Amt    Code    Flag
ABC Company Ltd         2000        400         A       Y   
DEFGHIJ Company         2580        1800        B       N   
KLM Services            9000        7000        A       Y   
NOPQ Industries         7300        8400        C       Y 

到目前为止,我已使用以下方法成功删除了重复项:

df.drop_duplicates(subset=['Company_Num', 'Company_Name', 'Code', '2019_Amt', '2020_Amt'])

使用生成的表:

Company_Num     Company_Name                2019_Amt    2020_Amt    Code    Flag    Manager
1               ABC Company Ltd             2000        400         A       Y       John
2               DEFGHIJ Company (London)    480         100         B       N       James
3               DEFGHIJ Company (Bristol)   600         700         B       N       James
4               DEFGHIJ Company (York)      1500        1000        B       N       James       
5               KLM Services                9000        7000        A       Y       Jane
6               NOPQ Industries             300         400         C       Y       Jen   
7               NOPQ Industries - London    7000        8000        C       Y       Jen              

我尝试过的解决方案是对每个公司名称的前9个字符进行子串,并使用groupby 然后求和,但这就剩下了作为子字符串保存的列。这也降低了成本 数据框中的列代码和标记,留给我的表如下:

df['SubString_Company_Name'] = df['Company_Name'].str.slice(0,9)
df.groupby([df.SubString_Company_Name]).sum().reset_index()
SubString_Company_Name    2019_Amt    2020_Amt    
ABC Compa                 2000        400
DEFGHIJ C                 2580        1800   
KLM Servi                 9000        7000
NOPQ Indu                 7300        8400

我曾尝试使用os.path.commonprefix函数获取公司名称,但找不到在数据帧中使用它的方法, 对于多个值。我的理解是,它将作为一个整体查看列表,并返回列表中最长的公共前缀 整个列表都不起作用。我还考虑将所有重复的子字符串提取到新的数据帧中并求和 并在合并回一个数据集之前重命名,但我不确定这是否有效。我在网上找到的解决方案 以统一数据为中心,其中lambda可以与分隔符一起使用,或者前缀的大小始终相同,而 我的数据不统一,前缀大小不一

我的数据每个月都会更改,因此我想设计一个不依赖子字符串的动态解决方案,因为我可能会遇到 只有9个字符的问题。我最后要考虑的是提取子字符串\u Company\u Name 在列表中,将其转换为公司名称的os.path.commonprefix,然后保存每个名称的唯一commonprefix值 将公司名称添加到新列表中,并为该列表中的每个项目创建一个新的汇总表。但我不知道这是否有效 在尝试之前,我想知道是否有更好或更有效的方法


Tags: 数据name名称df列表code公司company
1条回答
网友
1楼 · 发布于 2024-09-29 11:17:31

您可以在删除重复项后使用^{},并将^{}与拆分.str[0]中的第一个字符串一起用作grouper:

d= {'Company_Name':'first','2019_Amt':'sum','2019_Amt':'sum',
               '2020_Amt':'sum','Code':'first','Flag':'first'}
grouper = df['Company_Name'].str.split().str[0]

out = df.drop_duplicates().groupby(grouper).agg(d).reset_index(drop=True)
print(out)

               Company_Name  2019_Amt  2020_Amt Code Flag
0           ABC Company Ltd      2000       400    A    Y
1  DEFGHIJ Company (London)      2580      1800    B    N
2              KLM Services      9000      7000    A    Y
3           NOPQ Industries      7300      8400    C    Y

相关问题 更多 >