Pandas - 持续时间列 (mm:ss) 应该是什么数据类型才能在其上使用聚合?
Pandas - What datatype should a duration column (mm:ss) be to use aggregates on it?
我正在做一些 NBA 分析,并且有一个 mm:ss 格式的球员“上场时间”列。此列应该是什么 dtype 才能对其执行聚合函数(平均值、最小值、最大值等...)? df 有超过 20,000 行,因此这里是相关列的示例:
Minutes
0 18:30
1 24:50
2 33:21
3 28:39
4 27:30
我运行此代码将格式更改为日期时间-
df['Minutes'] = pd.to_datetime(df['Minutes'], format='%M:%S', errors='coerce')
数据类型更改成功,但我仍然无法对该列执行操作。
我在尝试聚合列时遇到此错误:
DataError: No numeric types to aggregate
我的聚合代码
df2 = df.groupby(['Name', 'Team']).agg({'Minutes' : 'mean'})
我希望能够看到平均分钟数并保留 mm:ss 格式。
感谢任何帮助。
import pandas as pd
data = {
'Minutes': ['18:30', '24:50', '33:21', '28:39', '27:30'],
'Team': ['team1', 'team2', 'team1', 'team1', 'team2']
}
df = pd.DataFrame(data)
df['Minutes'] = pd.to_timedelta('00:' + df['Minutes'].replace('',np.NaN)))
df.groupby('Team')['Minutes'].mean()
输出:
>>>
Team
team1 0 days 00:26:50
team2 0 days 00:26:10
Name: Minutes, dtype: timedelta64[ns]
我会添加另一列作为从 dt 属性派生的浮点数来进行聚合。
df_dict = {'Minutes': {0: Timestamp('1900-01-01 00:18:30'),
1: Timestamp('1900-01-01 00:24:50'),
2: Timestamp('1900-01-01 00:33:21'),
3: Timestamp('1900-01-01 00:28:39'),
4: Timestamp('1900-01-01 00:27:30')},
'points': {0: 22, 1: 34, 2: 25, 3: 31, 4: 33},
'name': {0: 'kobe', 1: 'jordan', 2: 'kobe', 3: 'jordan', 4: 'durant'},
'team': {0: 'lakers', 1: 'bulls', 2: 'lakers', 3: 'bulls', 4: 'nets'}}
df = pd.DataFrame(df_dict)
df['mins_float'] = df['Minutes'].dt.hour * 60 + df['Minutes'].dt.minute + df['Minutes'].dt.second/60
df_gb = df.groupby(['name', 'team']).agg({'mins_float': 'mean'})
print(df_gb)
mins_float
name team
durant nets 27.500000
jordan bulls 26.741667
kobe lakers 25.925000
如果你想回到一个 hms 字符串,你可以添加这个。
import datetime
df_gb['hms'] = df_gb['mins_float'].apply(lambda x:str(datetime.timedelta(minutes=x)))
print(df_gb)
mins_float hms
name team
durant nets 27.500000 0:27:30
jordan bulls 26.741667 0:26:44.500000
kobe lakers 25.925000 0:25:55.500000
我正在做一些 NBA 分析,并且有一个 mm:ss 格式的球员“上场时间”列。此列应该是什么 dtype 才能对其执行聚合函数(平均值、最小值、最大值等...)? df 有超过 20,000 行,因此这里是相关列的示例:
Minutes
0 18:30
1 24:50
2 33:21
3 28:39
4 27:30
我运行此代码将格式更改为日期时间-
df['Minutes'] = pd.to_datetime(df['Minutes'], format='%M:%S', errors='coerce')
数据类型更改成功,但我仍然无法对该列执行操作。 我在尝试聚合列时遇到此错误:
DataError: No numeric types to aggregate
我的聚合代码
df2 = df.groupby(['Name', 'Team']).agg({'Minutes' : 'mean'})
我希望能够看到平均分钟数并保留 mm:ss 格式。
感谢任何帮助。
import pandas as pd
data = {
'Minutes': ['18:30', '24:50', '33:21', '28:39', '27:30'],
'Team': ['team1', 'team2', 'team1', 'team1', 'team2']
}
df = pd.DataFrame(data)
df['Minutes'] = pd.to_timedelta('00:' + df['Minutes'].replace('',np.NaN)))
df.groupby('Team')['Minutes'].mean()
输出:
>>>
Team
team1 0 days 00:26:50
team2 0 days 00:26:10
Name: Minutes, dtype: timedelta64[ns]
我会添加另一列作为从 dt 属性派生的浮点数来进行聚合。
df_dict = {'Minutes': {0: Timestamp('1900-01-01 00:18:30'),
1: Timestamp('1900-01-01 00:24:50'),
2: Timestamp('1900-01-01 00:33:21'),
3: Timestamp('1900-01-01 00:28:39'),
4: Timestamp('1900-01-01 00:27:30')},
'points': {0: 22, 1: 34, 2: 25, 3: 31, 4: 33},
'name': {0: 'kobe', 1: 'jordan', 2: 'kobe', 3: 'jordan', 4: 'durant'},
'team': {0: 'lakers', 1: 'bulls', 2: 'lakers', 3: 'bulls', 4: 'nets'}}
df = pd.DataFrame(df_dict)
df['mins_float'] = df['Minutes'].dt.hour * 60 + df['Minutes'].dt.minute + df['Minutes'].dt.second/60
df_gb = df.groupby(['name', 'team']).agg({'mins_float': 'mean'})
print(df_gb)
mins_float
name team
durant nets 27.500000
jordan bulls 26.741667
kobe lakers 25.925000
如果你想回到一个 hms 字符串,你可以添加这个。
import datetime
df_gb['hms'] = df_gb['mins_float'].apply(lambda x:str(datetime.timedelta(minutes=x)))
print(df_gb)
mins_float hms
name team
durant nets 27.500000 0:27:30
jordan bulls 26.741667 0:26:44.500000
kobe lakers 25.925000 0:25:55.500000