Поиск дубликатов в столбце, установка условий, суммирование значений из другого столбца - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть CSV-файл, и я в настоящее время использую модуль панд. Не нашли решение моей проблемы. Вот пример, проблема и желаемый вывод CSV.

Образец CSV:

project, id, sec, code

1, 25, 50, 01

1, 25, 50, 12

1, 25, 45, 07

1, 5, 25, 03

1, 25, 20, 06

Проблема:

Я не хочу избавляться от дубликатов (id), но суммирую значения (с) в (code) 01, если дубликаты найдены с использованием других кодов, таких как 12, 7 и 6. Мне нужно знать, как установить условия, а также. Если код 7 меньше 60, не суммируйте. Я использовал следующий код для сортировки по столбцам. однако .isin избавляется от «id» 5. В большем файле будут другие дубликаты «id» со схожими кодами.

df = df.sort_values(by=['id'], ascending=[True])
df2 = df.copy()
sort1 = df2[df2['code'].isin(['01', '07', '06', '12'])]

Желаемый вывод:

project, id, sec, code

1, 5, 25, 03

1, 25, 120, 01

1, 25, 50, 12

1, 25, 45, 07

1, 25, 20, 06

Я думал о разборе файла, но я застрял на логике.

def edit_data(df):
sum = 0
with open(df) as file:
    next(file)

    for line in file:
        parts = line.split(',')
        code = float(parts[3])
        id = float(parts[1])
        sec = float(parts[2])

return  ?

Ценю любую помощь, поскольку я новичок в Python, эквивалентный 3-х месячному опыту. Спасибо!

1 Ответ

0 голосов
/ 04 сентября 2018

Давайте попробуем это:

df = df.sort_values('id')

#Use boolean indexing to eliminate unwanted records, then groupby and sum, convert the results to dataframe with indexes of groups.
sumdf = df[~((df.code == 7) & (df.sec < 60))].groupby(['project','id'])['sec'].sum().to_frame()

#Find first record of the group using duplicated and again with boolean indexing set the sec column for those records to NaN.
df.loc[~df.duplicated(subset=['project','id']),'sec'] = np.nan

#Set the index of the original dataframe and use combined_first to replace those NaN with values from the summed, grouped dataframe.
df_out = df.set_index(['project','id']).combine_first(sumdf).reset_index().astype(int)

df_out

Выход:

   project  id  code  sec
0        1   5     3   25
1        1  25     1  120
2        1  25    12   50
3        1  25     7   45
4        1  25     6   20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...