我有一个名为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的新手,所以我将不胜感激。
答案 0 :(得分:0)
假设Name
与String
是不同的,那么这就是您进行聚合的方式。我保留了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()