Python:在pandas中进行多列聚合
我使用dataframe在pandas中进行多列聚合Python:在pandas中进行多列聚合,python,pandas,aggregate,Python,Pandas,Aggregate,我使用dataframe在pandas中进行多列聚合 import pandas as pd import numpy as np df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3], 'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd'], 'lat': [1, 2, 3, 4, 5, 6, 7,
import pandas as pd
import numpy as np
df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd'],
'lat': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'long': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]})
df2 = df.groupby(['ser_no', 'CTRY_NM']).lat.agg({'avg_lat': np.mean})
通过这个代码,我得到了lat
的平均值。我还想找出long
的平均值
我尝试了df2=df.groupby(['ser_no','CTRY_NM']).lat.agg({'avg_lat':np.mean}).long.agg({'avg_long':np.mean})
,但这会产生
AttributeError:“DataFrame”对象没有属性“long”
如果我只做avg_long
,代码也能正常工作
df2 = df.groupby(['ser_no', 'CTRY_NM']).long.agg({'avg_long': np.mean})
In[2]: df2
Out[42]:
avg_long
ser_no CTRY_NM
1 a 21.5
b 23.0
2 a 26.0
b 27.0
e 24.5
3 b 28.5
d 30.0
是否有一种方法可以在一个步骤中执行此操作,或者这是我必须单独执行的操作,稍后再重新连接?您会收到错误,因为您首先选择数据帧的
lat
列并对该列执行操作。无法通过该系列获取long
列,您需要数据帧
df2 = df.groupby(['ser_no', 'CTRY_NM'])["lat", "long"].agg(np.mean)
将对两列执行相同的操作。如果要更改列名,可以在以后重命名列:
df2 = df.groupby(['ser_no', 'CTRY_NM'])["lat", "long"].agg(np.mean).rename(columns = {"lat": "avg_lat", "long": "avg_long"})
之所以会出现错误,是因为您首先选择了数据帧的
lat
列并对该列执行操作。无法通过该系列获取long
列,您需要数据帧
df2 = df.groupby(['ser_no', 'CTRY_NM'])["lat", "long"].agg(np.mean)
将对两列执行相同的操作。如果要更改列名,可以在以后重命名列:
df2 = df.groupby(['ser_no', 'CTRY_NM'])["lat", "long"].agg(np.mean).rename(columns = {"lat": "avg_lat", "long": "avg_long"})
我认为更简单的是使用: Ir您需要定义用于聚合的列:
print df.groupby(['ser_no', 'CTRY_NM']).agg({'lat' : 'mean', 'long' : 'mean'})
lat long
ser_no CTRY_NM
1 a 1.5 21.5
b 3.0 23.0
2 a 6.0 26.0
b 7.0 27.0
e 4.5 24.5
3 b 8.5 28.5
d 10.0 30.0
更多信息请访问
编辑:
如果需要重命名列名-删除列中的多索引
,可以使用列表理解
:
import pandas as pd
df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd'],
'lat': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'long': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
'date':pd.date_range(pd.to_datetime('2016-02-24'),
pd.to_datetime('2016-02-28'), freq='10H')})
print df
CTRY_NM date lat long ser_no
0 a 2016-02-24 00:00:00 1 21 1
1 a 2016-02-24 10:00:00 2 22 1
2 b 2016-02-24 20:00:00 3 23 1
3 e 2016-02-25 06:00:00 4 24 2
4 e 2016-02-25 16:00:00 5 25 2
5 a 2016-02-26 02:00:00 6 26 2
6 b 2016-02-26 12:00:00 7 27 2
7 b 2016-02-26 22:00:00 8 28 3
8 b 2016-02-27 08:00:00 9 29 3
9 d 2016-02-27 18:00:00 10 30 3
df2=df.groupby(['ser_no','CTRY_NM']).agg({'lat':'mean','long':'mean','date':[min,max,'count']})
df2.columns = ['_'.join(col) for col in df2.columns]
我认为更简单的是使用:
Ir您需要定义用于聚合的列:
print df.groupby(['ser_no', 'CTRY_NM']).agg({'lat' : 'mean', 'long' : 'mean'})
lat long
ser_no CTRY_NM
1 a 1.5 21.5
b 3.0 23.0
2 a 6.0 26.0
b 7.0 27.0
e 4.5 24.5
3 b 8.5 28.5
d 10.0 30.0
更多信息请访问
编辑:
如果需要重命名列名-删除列中的多索引
,可以使用列表理解
:
import pandas as pd
df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd'],
'lat': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'long': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
'date':pd.date_range(pd.to_datetime('2016-02-24'),
pd.to_datetime('2016-02-28'), freq='10H')})
print df
CTRY_NM date lat long ser_no
0 a 2016-02-24 00:00:00 1 21 1
1 a 2016-02-24 10:00:00 2 22 1
2 b 2016-02-24 20:00:00 3 23 1
3 e 2016-02-25 06:00:00 4 24 2
4 e 2016-02-25 16:00:00 5 25 2
5 a 2016-02-26 02:00:00 6 26 2
6 b 2016-02-26 12:00:00 7 27 2
7 b 2016-02-26 22:00:00 8 28 3
8 b 2016-02-27 08:00:00 9 29 3
9 d 2016-02-27 18:00:00 10 30 3
df2=df.groupby(['ser_no','CTRY_NM']).agg({'lat':'mean','long':'mean','date':[min,max,'count']})
df2.columns = ['_'.join(col) for col in df2.columns]
我很欣赏这个答案,但这可能会引起问题,因为在真实的数据集中,我有我不想说的列。我只是在这里提出了一个小问题。如果你有更多的列,只需通过对dataframe进行子集来排除它们。我很欣赏这个答案,但这可能会导致问题,因为在真实的数据集中,我有我不想说的列。我只是在这里提出了一个小问题。如果你有更多的列,只需通过对数据帧进行子集来排除它们。我可以将数据帧agg和系列agg串在一起吗?也就是说,然后在一个日期列上做一个单独的agg?如果我理解正确,是的.agg
接受字典,但其工作方式与您尝试使用的不同。每个键都是一列,每个值都是要应用于该列的函数<例如,code>df.groupby(['ser_no','CTRY_NM')).agg({“lat”:np.mean,“long”:np.mean,“date”:np.max})
将取lat和long的平均值,但返回每个组的最大日期。您理解正确,但如果对于日期,我想要date.agg({“start_dt”:min,“end_dt”:max,“number_dt”:“count”)
会有多个参数,还是只限于一个参数?它看起来像:df2=df.groupby(['ser_no',CTRY_NM'])[“lat”,“long”].agg({'lat':np.mean,'long':np.mean,'date':{'start_dt':min,'end_dt':max,'number_of_dt':'count})。重命名(列={'lat:'avg':“avg_lat”,“long”:“avg”})
?您可以为列表中的同一列指定不同的函数:df.groupby(['ser\u no',CTRY\u NM']).agg({“lat”:np.mean,“long”:np.mean,“date”:['max',min',count']})
这将采用每个组的日期的最大、最小和计数。不过,据我所知,您需要在以后更改列名。我可以将数据帧agg和系列agg串在一起吗?也就是说,然后在一个日期列上做一个单独的agg?如果我理解正确,是的.agg
接受字典,但其工作方式与您尝试使用的不同。每个键都是一列,每个值都是要应用于该列的函数<例如,code>df.groupby(['ser_no','CTRY_NM')).agg({“lat”:np.mean,“long”:np.mean,“date”:np.max})
将取lat和long的平均值,但返回每个组的最大日期。您理解正确,但如果对于日期,我想要date.agg({“start_dt”:min,“end_dt”:max,“number_dt”:“count”)
会有多个参数,还是只限于一个参数?它看起来像:df2=df.groupby(['ser_no',CTRY_NM'])[“lat”,“long”].agg({'lat':np.mean,'long':np.mean,'date':{'start_dt':min,'end_dt':max,'number_of_dt':'count})。重命名(列={'lat:'avg':“avg_lat”,“long”:“avg”})
?您可以为列表中的同一列指定不同的函数:df.groupby(['ser\u no',CTRY\u NM']).agg({“lat”:np.mean,“long”:np.mean,“date”:['max',min',count']})
这将采用每个组的日期的最大、最小和计数。但是,据我所知,您需要在以后更改列名。