Python суммируйте это дважды для группового - PullRequest
0 голосов
/ 12 сентября 2018

Я борюсь с суммой серий после того, как уже сгруппировал фрейм данных, и я надеялся, что кто-нибудь может помочь мне с идеей.В основном, в приведенном ниже примере мне нужно иметь сумму для каждого «Материала».В основном материал "ABC" должен дать мне 2, а все остальные, так как они имеют только одну знаковую операцию, будут иметь одинаковое значение.

import numpy as np
import pandas as pd

df = pd.DataFrame({ 
    "Material" : ["M-12", "H4-LAMPE", "M-12", "H4-LAMPE",
                  "ABC" , "H4-LAMPE", "ABC", "ABC"] , 
    "Quantity" : [6, 1, 3, 5, 1, 1, 10, 9],
    "TYPE": ["+", "-", "+", "-", "+", "-", "+", "-"]})
df.groupby(['Material', "Quantity"], as_index=False).count()

listX = []
for item in df["TYPE"]:
    if item == "+":
        listX.append(1)
    elif item == "-":
        listX.append(-1)
    else:
        pass
df["Sign"] = lista
df["MovementsQty"] = df["Quantity"]*df["Sign"]
#df = df.groupby(["Material", "TYPE", "Quantity1"]).sum()
df1 = df.groupby(["Material", "TYPE"]).sum()
df1.drop(columns=["Quantity", "Sign"], inplace=True)

print(df1)

Результат:

enter image description here

Желаемый результат:

enter image description here

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

Большое спасибо за помощь

Ответы [ 3 ]

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

Вот еще один дубль (довольно похожий на холодную скорость).

#Correct quantity with negative sign (-) according to TYPE 
df.loc[df['TYPE'] == '-', 'Quantity'] *= -1

#Reconstruct df as sum of quantity to remove dups
df = df.groupby('Material')['Quantity'].sum().reset_index()
df['TYPE'] = np.where(df['Quantity'] < 0, '-', '+')

print(df)

Возвращает:

   Material  Quantity TYPE
0       ABC         2    +
1  H4-LAMPE        -7    -
2      M-12         9    +
0 голосов
/ 12 сентября 2018

map и numpy.sign

Просто подведите итог Quantity * TYPE и выясните знак впоследствии.

d = {'+': 1, '-': -1}
r = dict(map(reversed, d.items())).get
q = df.Quantity
m = df.Material
t = df.TYPE

s = pd.Series((q * t.map(d)).values, m, name='MovementsQty').sum(level=0)
s.reset_index().assign(TYPE=lambda x: [*map(r, np.sign(x.MovementsQty))])

   Material  MovementsQty TYPE
0      M-12             9    +
1  H4-LAMPE            -7    -
2       ABC             2    +
0 голосов
/ 12 сентября 2018

Вы на правильном пути. Я пытался улучшить ваш код. Просто используйте «Тип», чтобы определить и назначить знак, используя np.where, выполнить groupby и sum, а затем пересчитать столбец «Тип» на основе результата.

v = (df.assign(Quantity=np.where(df.TYPE == '+', df.Quantity, -df.Quantity))
       .groupby('Material', as_index=False)[['Quantity']]
       .sum())

v.insert(1, 'Type', np.where(np.sign(v.Quantity) == 1, '+', '-'))

print (v)
   Material Type  Quantity
0       ABC    +         2
1  H4-LAMPE    -        -7
2      M-12    +         9

Кроме того, вы можете сделать это с помощью двух groupby вызовов:

i = df.query('TYPE == "+"').groupby('Material').Quantity.sum()
j = df.query('TYPE == "-"').groupby('Material').Quantity.sum()
# Find the union of the indexes.
idx = i.index.union(j.index)
# Reindex and subtract.
v = i.reindex(idx).fillna(0).sub(j.reindex(idx).fillna(0)).reset_index()
# Insert the Type column back into the result.
v.insert(1, 'Type', np.where(np.sign(v.Quantity) == 1, '+', '-'))

print(v)
   Material Type  Quantity
0       ABC    +       2.0
1  H4-LAMPE    -      -7.0
2      M-12    +       9.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...