Pandas怎样实现groupby聚合后字符串列的合并
需求:
计算每个月的最高温度、最低温度、出现的风向列表、出现的空气质量列表
数据输入
数据输出
读取数据
import pandas as pd
fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
df = pd. read_csv( fpath)
df. head( 3 )
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel 0 2018-01-01 3℃ -6℃ 晴~多云 东北风 1-2级 59 良 2 1 2018-01-02 2℃ -5℃ 阴~多云 东北风 1-2级 49 优 1 2 2018-01-03 2℃ -5℃ 多云 北风 1-2级 28 优 1
知识:使用df.info()可以查看每列的类型
df. info( )
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 365 entries, 0 to 364
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ymd 365 non-null object
1 bWendu 365 non-null object
2 yWendu 365 non-null object
3 tianqi 365 non-null object
4 fengxiang 365 non-null object
5 fengli 365 non-null object
6 aqi 365 non-null int64
7 aqiInfo 365 non-null object
8 aqiLevel 365 non-null int64
dtypes: int64(2), object(7)
memory usage: 25.8+ KB
知识:series怎样从str类型变成int
df[ "bWendu" ] = df[ "bWendu" ] . str . replace( "℃" , "" ) . astype( 'int32' )
df[ "yWendu" ] = df[ "yWendu" ] . str . replace( "℃" , "" ) . astype( 'int32' )
df. head( 3 )
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel 0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2 1 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1 2 2018-01-03 2 -5 多云 北风 1-2级 28 优 1
知识:进行日期列解析,可以方便提取月份
df[ "ymd" ] = pd. to_datetime( df[ "ymd" ] )
df[ "ymd" ] . dt. month
0 1
1 1
2 1
3 1
4 1
..
360 12
361 12
362 12
363 12
364 12
Name: ymd, Length: 365, dtype: int64
知识:series可以用Series.unique去重
df[ "fengxiang" ] . unique( )
array(['东北风', '北风', '西北风', '西南风', '南风', '东南风', '东风', '西风'], dtype=object)
知识:可以用",".join(series)实现数组合并成大字符串
"," . join( df[ "fengxiang" ] . unique( ) )
'东北风,北风,西北风,西南风,南风,东南风,东风,西风'
方法1
result = (
df. groupby( df[ "ymd" ] . dt. month)
. agg(
最高温度= ( "bWendu" , "max" ) ,
最低温度= ( "yWendu" , "min" ) ,
风向列表= ( "fengxiang" , lambda x : "," . join( x. unique( ) ) ) ,
空气质量列表= ( "aqiInfo" , lambda x : "," . join( x. unique( ) ) )
)
. reset_index( )
. rename( columns= { "ymd" : "月份" } )
)
result
月份 最高温度 最低温度 风向列表 空气质量列表 0 1 7 -12 东北风,北风,西北风,西南风,南风,东南风,东风 良,优,轻度污染,中度污染 1 2 12 -10 北风,西南风,南风,西北风,西风,东北风,东风 良,优,轻度污染,中度污染,重度污染 2 3 27 -4 西南风,北风,东南风,南风,东北风,东风 优,良,重度污染,轻度污染,中度污染,严重污染 3 4 30 1 南风,北风,东北风,西南风,西北风,东南风 重度污染,良,优,轻度污染,中度污染 4 5 35 10 东北风,北风,西南风,南风,东南风,东风,西风,西北风 轻度污染,优,良,中度污染 5 6 38 17 西南风,南风,北风,东风,东南风,东北风 良,轻度污染,优,中度污染 6 7 37 22 东南风,西南风,南风,东北风,东风,西风,北风 良,轻度污染,优 7 8 36 20 东南风,南风,东风,东北风,北风,西南风 良,轻度污染,优 8 9 31 11 南风,北风,西南风,西北风 优,良,轻度污染 9 10 25 1 北风,西北风,南风,西风,东北风,西南风 优,良,轻度污染,中度污染 10 11 18 -4 南风,北风,西南风,东南风,西北风,东北风 良,轻度污染,重度污染,优,中度污染 11 12 10 -12 东南风,东北风,西北风,西南风 中度污染,重度污染,良,优,轻度污染
方法2
def agg_func ( x) :
"""注意,这个x是每个分组的dataframe"""
return pd. Series( {
"最高温度" : x[ "bWendu" ] . max ( ) ,
"最低温度" : x[ "yWendu" ] . min ( ) ,
"风向列表" : "," . join( x[ "fengxiang" ] . unique( ) ) ,
"空气质量列表" : "," . join( x[ "aqiInfo" ] . unique( ) )
} )
result = df \
. groupby( df[ "ymd" ] . dt. month) \
. apply ( agg_func) \
. reset_index( ) \
. rename( columns= { "ymd" : "月份" } )
result
月份 最高温度 最低温度 风向列表 空气质量列表 0 1 7 -12 东北风,北风,西北风,西南风,南风,东南风,东风 良,优,轻度污染,中度污染 1 2 12 -10 北风,西南风,南风,西北风,西风,东北风,东风 良,优,轻度污染,中度污染,重度污染 2 3 27 -4 西南风,北风,东南风,南风,东北风,东风 优,良,重度污染,轻度污染,中度污染,严重污染 3 4 30 1 南风,北风,东北风,西南风,西北风,东南风 重度污染,良,优,轻度污染,中度污染 4 5 35 10 东北风,北风,西南风,南风,东南风,东风,西风,西北风 轻度污染,优,良,中度污染 5 6 38 17 西南风,南风,北风,东风,东南风,东北风 良,轻度污染,优,中度污染 6 7 37 22 东南风,西南风,南风,东北风,东风,西风,北风 良,轻度污染,优 7 8 36 20 东南风,南风,东风,东北风,北风,西南风 良,轻度污染,优 8 9 31 11 南风,北风,西南风,西北风 优,良,轻度污染 9 10 25 1 北风,西北风,南风,西风,东北风,西南风 优,良,轻度污染,中度污染 10 11 18 -4 南风,北风,西南风,东南风,西北风,东北风 良,轻度污染,重度污染,优,中度污染 11 12 10 -12 东南风,东北风,西北风,西南风 中度污染,重度污染,良,优,轻度污染