Группировка уникальных строк в столбце и выполнение функции по отдельным значениям столбца - PullRequest
1 голос
/ 26 сентября 2019

В моем фрейме данных у меня есть столбец "away_lineup", который содержит группировки из 5 строк, а также столбец "play_length", который имеет значение длительности для каждой строки.Я знаю, что np.unique может обнаруживать уникальные строковые значения, а значение np.sum добавляет значения в столбце, но как мне использовать функцию, подобную np.unique, для обнаружения каждой уникальной строки и суммирования значений «play_length», что строкапроисходит подряд с?

away_lineup                                                                play_length
0  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:05
1  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:10
2  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:20
3  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:07
4  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:25
5  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, JJ Redick       0:00:14

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

player              play_length
Dario Saric             0:01:21
Robert Covington        0:01:21
Joel Embiid             0:01:21
Markelle Fultz          0:01:21
Ben Simmons             0:01:07
JJ Redick               0:00:14

Где уникальные имена извлекаются из "away_lineup", сохраняются в новом столбце "player" и строках, где игрокприсутствующие значения имеют свои добавленные значения play_length.

Ответы [ 4 ]

0 голосов
/ 26 сентября 2019

вы можете использовать разнесение и группировку следующим образом

import numpy as np
import pandas as pd

## create dummy data
arr = [("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:05"),
("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:10"),
("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:20"),
("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:07"),
("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:25"),
("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, JJ Redick", "00:00:14"),]

df = pd.DataFrame(arr, columns=["Player", "Play Time"])
df["Play Time"] = pd.to_timedelta(df["Play Time"])

## Solution
df["Player"] = df["Player"].str.split(",")
df.explode("Player").groupby("Player").sum()

output

            Play Time
Player  
Ben Simmons 00:01:07
JJ Redick   00:00:14
Joel Embiid 00:01:21
Markelle Fultz  00:01:21
Robert Covington    00:01:21
Dario Saric 00:01:21
0 голосов
/ 26 сентября 2019

Если ваши панды не поддерживают explode:

df['play_length'] = pd.to_timedelta(df['play_length'])

new_df = pd.concat((df[['play_length']], 
                    df['away_lineup'].str.split(',\s*', expand=True)), 
                   axis=1)

(new_df.melt(id_vars=['play_length'], 
             value_vars=new_df.columns[1:], 
             value_name='artist')
   .groupby('artist').play_length.sum()
)

Вывод:

artist
Ben Simmons        00:01:07
Dario Saric        00:01:21
JJ Redick          00:00:14
Joel Embiid        00:01:21
Markelle Fultz     00:01:21
Robert Covington   00:01:21
Name: play_length, dtype: timedelta64[ns]
0 голосов
/ 26 сентября 2019

Проверьте трюк get_dummies

#df['play_length'] = pd.to_timedelta(df['play_length'])

df.away_lineup.str.get_dummies(',').mul(df.play_length,0).sum()
Out[372]: 
 Ben Simmons        00:01:07
 JJ Redick          00:00:14
 Joel Embiid        00:01:21
 Markelle Fultz     00:01:21
 Robert Covington   00:01:21
 Dario Saric        00:01:21
dtype: timedelta64[ns]
0 голосов
/ 26 сентября 2019

Использование pandas.DataFrame.explode и pandas.to_timedelta:

Примечание : pandas.DataFrame.explode доступно с pandas> = 0,25

df['away_lineup'] = df['away_lineup'].str.split(', ')
df['play_length'] = pd.to_timedelta(df['play_length'])
new_df = df.explode('away_lineup').groupby('away_lineup').sum()
print(new_df)

Вывод:

                 play_length
away_lineup                 
Ben Simmons         00:01:07
Dario Saric         00:01:21
JJ Redick           00:00:14
Joel Embiid         00:01:21
Markelle Fultz      00:01:21
Robert Covington    00:01:21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...