Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在pandas中进行多列聚合_Python_Pandas_Aggregate - Fatal编程技术网

Python:在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,

我使用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, 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']})
这将采用每个组的日期的最大、最小和计数。但是,据我所知,您需要在以后更改列名。