Сравнить строку со всеми другими предыдущими строками в одном столбце и изменить значение другого столбца в Python

#python-3.x #pandas #csv

#python-3.x #pandas #csv

Вопрос:

У меня есть файл csv с именем namelist.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 или is substring all above rows , затем удалите предыдущие строки и суммируйте значение Size столбца со значением subtring строки.

Пример: я беру строку 3rd: AAA123000DDD , сравниваю ее с 2 строками 1-й и 2-й, вижу, что она совпадает с 1-й строкой, она удалит 1-ю строку, а затем суммирует значение столбца 1-й строки с столбцом Size 3-й 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 столбцов, но я не знаю, как применить сравнение String столбца и суммы Size столбца.
Я новичок в Python, поэтому буду очень признателен за любую помощь.

Ответ №1:

Предполагая 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()
 

Комментарии:

1. это работа! большое спасибо! но я не знаю, могу ли я заменить имя столбца индексом столбца. Пример: вместо df['Strings'] df[«порядок столбцов»] ?? ! @Sam