#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