Рассчитать значения от группы панд - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь понять, как использовать панд в групповом режиме.

Мой фрейм данных выглядит так

index ID Code Quantity
0    400 ZU   5000
1    400 ZO   12
2    401 ZU   9000
3    401 ZO   15
4    402 ZU   1000
5    403 ZO   15

Я бы хотел сгруппировать ID и код и создать дополнительный столбец, который делит количество ZU на количество ZO, но только если в groupby есть запись для обоих. Если один из них отсутствует, данные могут быть отброшены.

Я знаю, что могу группировать по нескольким столбцам, например:

data.groupby(['ID', 'Code'])

Но я не знаю, как поступить, потому что мне не нужны значения .sum() или .mean().

Ожидаемый результат может быть примерно таким:

index ID value
0    400 416.17
1    401 600

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Используйте pivot с dropna, затем разделите на div:

df1 = df.pivot('ID', 'Code', 'Quantity').dropna()
print (df1)
Code    ZO      ZU
ID                
400   12.0  5000.0
401   15.0  9000.0

df2 = df1['ZU'].div(df1['ZO']).reset_index(name='val')
print (df2)
    ID         val
0  400  416.666667
1  401  600.000000
0 голосов
/ 07 ноября 2018

Строго говоря, вам не нужно groupby здесь. Вы можете отфильтровать ваш фрейм данных и использовать set_index для создания двух отображений. Затем разделите одно на другое и удалите нулевые значения.

zu = df.loc[df['Code'] == 'ZU'].set_index('ID')['Quantity']
zo = df.loc[df['Code'] == 'ZO'].set_index('ID')['Quantity']

res = (zu / zo).dropna().reset_index()

print(res)

    ID    Quantity
0  400  416.666667
1  401  600.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...