Панды - как присоединиться только к первому матчу и оставить другие матчи равными 0 - PullRequest
0 голосов
/ 24 июня 2019

Я хочу объединить два фрейма данных. Это слияние слева, но я не хочу соответствовать всем экземплярам. Я просто хочу сохранить матч для первого матча и поставить 0 для всех остальных матчей.

Вот что у меня есть:

+--------+----------+--------+
| Eticket| Passenger|  Age   | 
+--------+----------+--------+
| ABCD   | 1        | Adult  |
| SDFD   | 1        | Adult  |
| SDFD   | 1        | Child  |
| SDFD   | 1        | Child  |
| WERT   | 1        | Adult  |
| WERT   | 1        | Adult  | 
| ASWD   | 1        | Adult  | 
+--------+----------+--------+

Я пытаюсь объединить подсчет пассажиров и сделать так:

+--------+----------+--------+
| Eticket| Passenger|  Age   | 
+--------+----------+--------+
| ABCD   | 1        | Adult  |
| SDFD   | 3        | Adult  |
| SDFD   | 0        | Child  |
| SDFD   | 0        | Child  |
| WERT   | 2        | Adult  |
| WERT   | 0        | Adult  | 
| ASWD   | 1        | Adult  | 
+--------+----------+--------+


passenger_group = pd.DataFrame(df.groupby(by='Eticket')['Passenger'].sum())

Я легко могу создать таблицу, которая генерирует счетчик для каждого Eticket, но когда я пытаюсь объединить это, очевидно, выглядит так:

+--------+----------+--------+
| Eticket| Passenger|  Age   | 
+--------+----------+--------+
| ABCD   | 1        | Adult  |
| SDFD   | 3        | Adult  |
| SDFD   | 3        | Child  |
| SDFD   | 3        | Child  |
| WERT   | 2        | Adult  |
| WERT   | 2        | Adult  | 
| ASWD   | 1        | Adult  | 
+--------+----------+--------+

Как мне соединить эти два фрейма данных (или даже использовать какой-нибудь альтернативный метод), чтобы получить желаемый результат?

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Я использую transform сумму и присваиваю обратно, используя duplicated

df.loc[~df.Eticket.duplicated(),'New']=df.groupby('Eticket').Passenger.transform('sum')
df.New.fillna(0,inplace=True)
df
  Eticket  Passenger    Age  New
0    ABCD          1  Adult  1.0
1    SDFD          1  Adult  3.0
2    SDFD          1  Child  0.0
3    SDFD          1  Child  0.0
4    WERT          1  Adult  2.0
5    WERT          1  Adult  0.0
6    ASWD          1  Adult  1.0
1 голос
/ 24 июня 2019

Почему бы вам не преобразовать сумму

df['Passenger'] = df.groupby(by='Eticket')['Passenger'].transform(sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...