Как получить совокупную сумму уникальных идентификаторов с группировкой по? - PullRequest
2 голосов
/ 07 марта 2019

Я очень плохо знаком с Python и пандами, работающими над кадром данных панд, который выглядит как

Date     Time           ID   Weight
Jul-1     12:00         A       10
Jul-1     12:00         B       20
Jul-1     12:00         C       100
Jul-1     12:10         C       100
Jul-1     12:10         D       30
Jul-1     12:20         C       100
Jul-1     12:20         D       30
Jul-1     12:30         A       10
Jul-1     12:40         E       40
Jul-1     12:50         F       50
Jul-1     1:00          A       40

Я пытаюсь выполнить группировку по дате, времени и идентификаторам и применить кумулятивную сумму таким образом, чтобы, если идентификатор присутствовал в следующем интервале времени, вес добавлялся только один раз (однозначно). Результирующий кадр данных будет выглядеть следующим образом

Date     Time           Weight   
Jul-1     12:00         130     (10+20+100)
Jul-1     12:10         160     (10+20+100+30)
Jul-1     12:20         160     (10+20+100+30)
Jul-1     12:30         160     (10+20+100+30)
Jul-1     12:40         200     (10+20+100+30+40)
Jul-1     12:50         250     (10+20+100+30+40+50)
Jul-1     01:00         250     (10+20+100+30+40+50)

Это то, что я попробовал ниже, однако это все еще учитывает веса несколько раз:

df=df.groupby(['date','time','ID'])['Wt'].apply(lambda x: x.unique().sum()).reset_index()
df['cumWt']=df['Wt'].cumsum()

Любая помощь будет очень признательна!

Большое спасибо заранее !!

1 Ответ

1 голос
/ 07 марта 2019

В приведенном ниже коде используются pandas.duplicate () , pandas.merge () , pandas.groupby / sum и pandas.cumsum () , чтобы прийти к желаемому выводу:

# creates a series of weights to be considered and rename it to merge
unique_weights = df['weight'][~df.duplicated(['weight'])]
unique_weights.rename('consider_cum', inplace = True)

# merges the series to the original dataframe and replace the ignored values by 0
df = df.merge(unique_weights.to_frame(), how = 'left', left_index=True, right_index=True)
df.consider_cum = df.consider_cum.fillna(0)

# sums grouping by date and time
df = df.groupby(['date', 'time']).sum().reset_index()

# create the cumulative sum column and present the output
df['weight_cumsum'] = df['consider_cum'].cumsum()
df[['date', 'time', 'weight_cumsum']]

Создает следующий вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...