将列中的唯一字符串分组并对单独的列值执行函数

2024-06-28 11:02:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的数据帧中,我有一个列“away\u lineup”,它包含5个字符串的分组,还有一个“play\u length”列,每行有一个持续时间值。我知道np.unique可以检测唯一的字符串值,np.sum值在列中添加值,但是如何使用像np.unique这样的函数来检测每个唯一的字符串,并对字符串所在行中的“play\u 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

其中从“客场\阵容”中提取唯一的名称,存储在新的列“player”中,并且存在player值的行添加了它们的“play \ u length”值


Tags: 字符串playnprobertlengthplayerbenjoel
3条回答

你可以像这样使用explode和group by

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()

输出

            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

使用^{}^{}

pandas.DataFrame.explodepandas>;一起提供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

如果您的熊猫不支持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]

相关问题 更多 >