将行与一列中的所有其他先前字符串进行比较,并在Python中更改另一列的值

时间:2019-04-19 02:52:50

标签: python-3.x pandas csv

我有一个名为namelist.csv的csv文件,其中包括:

Index String             Size           Name
1     AAA123000DDD        10             One
2     AAA123DDDQQQ        20             One
3     AAA123000DDD        25             One
4     AAA123D             20             One
5     ABA                 15             One
6     FFFrrrSSSBBB        60             Two
7     FFFrrrSSSBBB        30             Two
8     FFFrrrSS            50             Two
9     AAA12               70             Two

我想比较每个名称组的列String中的行:如果每行中的字符串是match的{​​{1}}或is substring,则删除前面的行并将all above rows列的值与Size行的值相加。

示例:我选择第3行:subtring,将其与2行的第1行和第2行进行比较,发现它与第1行匹配,它将删除第一行,然后删除第一行的总和列AAA123000DDD到第三行列Size。 那么表格将如下所示:

Size

最终结果将是:

Index String             Size           Name
2     AAA123DDDQQQ        20             One
3     AAA123000DDD        35             One
4     AAA123D             20             One
...

我考虑使用Index String Size Name 3 AAA123000DDD 35 One 4 AAA123D 40 One 5 ABA 15 One 8 FFFrrrSS 140 Two 9 AAA12 70 Two 中的groupby对所有pandas列进行分组,但是我不知道如何应用Name列的比较和{ {1}}列。 我是Python的新手,所以我将不胜感激。

1 个答案:

答案 0 :(得分:0)

假设NameString是不同的,那么这就是您进行聚合的方式。我保留了Name,以便它也显示在最后的DataFrame中。

df_group = df.groupby(['String', 'Name'])['Size'].sum().reset_index()

编辑:

要匹配子字符串(并使用上面的示例,该子字符串似乎与多个字符串不匹配),您可以将子字符串映射为完整字符串,然后像以前一样按完整字符串列进行分组:

all_strings = set(df['Strings'])


substring_dict = dict()


for row in df.itertuples():
    for item in all_strings:
        if row.String in item:
            substring_dict[row.String] = item


def match_substring(x):
    return substring_dict[x]


df['full_strings'] = df.String.apply(match_substring)

df_group = df.groupby(['full_strings', 'Name'])['Size'].sum().reset_index()