Как суммировать значения групп на основе, если группа находится в указанном списке? - PullRequest
1 голос
/ 13 июля 2020

У меня есть фрейм данных (data2), состоящий из заказов на продажу разных производителей со столбцом под названием 'num units sold_x'.

Если имя производителя существует в списке под названием Dataman:

Я хочу обновить значение «num units sold_x» в каждой строке, взяв сумму столбца в фрейме данных под названием «EQTUnit» для каждого конкретного производителя . Это нормально, если все строки для конкретного производителя имеют одно и то же поле «num units sold_x», поскольку это сумма «EQTUnit» для каждого производителя.

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

for index,row in data2.iterrows():
    for x in dataman:
        if data2.loc[index, 'EQTMan'] in dataman:
            data2.loc[index, 'num units sold_x'] = data2[data2['EQTMan'] == x].EQTUnit.sum()

Вот некоторые примеры данных:

    UCCStatus   UCCDate     EQTMan  EQTUnit
0   SALE        5/20/2019   SPARTAN 1
1   SALE        5/28/2019   SPARTAN 2
2   SALE        5/29/2019   SPARTAN 1
3   SALE        5/25/2019   SPARTAN 1
4   TERMINATI   7/16/2019   JOHNSON 11
5   SALE        8/8/2019    SPARTAN 1
6   TERMINATI   9/17/2019   SPARTAN 1
7   SALE        8/16/2019   TITAN   2
8   SALE        8/5/2019    TITAN   2
9   SALE        8/5/2019    TITAN   2

В основном мне нужно часто обновлять поле 'num units sold_x', взяв сумму EQTUnit для каждого уникального производителя.

Ожидаемый результат:

   UCCStatus    UCCDate     EQTMan  EQTUnit num units sold_x
0   SALE        5/20/2019   SPARTAN 1       7
1   SALE        5/28/2019   SPARTAN 2       7
2   SALE        5/29/2019   SPARTAN 1       7
3   SALE        5/25/2019   SPARTAN 1       7
4   TERMINATI   7/16/2019   JOHNSON 11      11
5   SALE        8/8/2019    SPARTAN 1       7
6   TERMINATI   9/17/2019   SPARTAN 1       7
7   SALE        8/16/2019   TITAN   2   
8   SALE        8/5/2019    TITAN   2   
9   SALE        8/5/2019    TITAN   2   

1 Ответ

1 голос
/ 14 июля 2020

Используйте .loc для фильтрации строк, используя .isin() против списка dataman, чтобы увидеть, находятся ли они в фрейме данных.

Затем используйте .groupby и transform в этом отфильтрованном наборе данных .

ввод:

    UCCStatus   UCCDate     EQTMan  EQTUnit
0   SALE        5/20/2019   SPARTAN 1
1   SALE        5/28/2019   SPARTAN 2
2   SALE        5/29/2019   SPARTAN 1
3   SALE        5/25/2019   SPARTAN 1
4   TERMINATI   7/16/2019   JOHNSON 11
5   SALE        8/8/2019    SPARTAN 1
6   TERMINATI   9/17/2019   SPARTAN 1
7   SALE        8/16/2019   TITAN   2
8   SALE        8/5/2019    TITAN   2
9   SALE        8/5/2019    TITAN   2

код:

dataman = ['SPARTAN', 'JOHNSON']
data2['num units sold_x'] = ''
data2.loc[data2['EQTMan'].isin(dataman), 'num units sold_x'] = 
data2.loc[data2['EQTMan'].isin(dataman)].groupby('EQTMan')['EQTUnit'].transform('sum')
data2

вывод:

   UCCStatus    UCCDate     EQTMan  EQTUnit num units sold_x
0   SALE        5/20/2019   SPARTAN 1       7
1   SALE        5/28/2019   SPARTAN 2       7
2   SALE        5/29/2019   SPARTAN 1       7
3   SALE        5/25/2019   SPARTAN 1       7
4   TERMINATI   7/16/2019   JOHNSON 11      11
5   SALE        8/8/2019    SPARTAN 1       7
6   TERMINATI   9/17/2019   SPARTAN 1       7
7   SALE        8/16/2019   TITAN   2   
8   SALE        8/5/2019    TITAN   2   
9   SALE        8/5/2019    TITAN   2   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...