美文网首页
40 Pandas怎样实现groupby聚合后字符串列的合并

40 Pandas怎样实现groupby聚合后字符串列的合并

作者: Viterbi | 来源:发表于2022-12-07 15:09 被阅读0次

    40 Pandas怎样实现groupby聚合后字符串列的合并

    需求:

    计算每个月的最高温度、最低温度、出现的风向列表、出现的空气质量列表

    数据输入

    数据输出

    读取数据

    import pandas as pd
    
    fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
    df = pd.read_csv(fpath)
    df.head(3)
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    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)
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    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
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    月份 最高温度 最低温度 风向列表 空气质量列表
    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
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    月份 最高温度 最低温度 风向列表 空气质量列表
    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 东南风,东北风,西北风,西南风 中度污染,重度污染,良,优,轻度污染

    本文使用 文章同步助手 同步

    相关文章

      网友评论

          本文标题:40 Pandas怎样实现groupby聚合后字符串列的合并

          本文链接:https://www.haomeiwen.com/subject/vgfmtdtx.html