代码之家  ›  专栏  ›  技术社区  ›  Jabbar

按数据帧分组,并对每组的子地块进行迭代

  •  -3
  • Jabbar  · 技术社区  · 2 年前

    我有一个数据帧。我想(在步骤1中)按“Main”列对其进行分组(创建df_M1和df_M2,并为每个创建的df制作一个子图)。在(步骤2)中,按列“Sub”对每个df(df_M1和df_M2)进行分组(以创建df_S1、df_S2、df_S3、df_S4)。然后在(步骤3)中循环每个Sub-df的列(col1和col2),将它们绘制在其中一个图上。实际上,步骤1创建两个数据帧,步骤2为步骤1中创建的每个数据帧创建四个数据帧。所以我想为(df_M1和df_M2)创建两组子图(每个子图有4个图(2*2)),为(df_S1,df_S2,df_S3,df_S4)创建每个子图。每个图都包含col1和col2折线图。列“日期”在X轴上,col1和col2的值在Y轴上。 我写了以下脚本,但在定义绘制折线图的子情节时存在问题。那么,有人能告诉我我如何定义每个Sub-df的子图(轴),并在每个图上绘制每个Sub-df的coulns(col1和col2)吗?

    创建示例数据帧

    data = {'Date': [2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001],
            'Main': ['A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B'],
           'Sub' : ['A1','A1','A2','A2','A3','A3','A4','A4','B1','B1','B2','B2','B3','B3','B4','B4'],
           'col1' : [1,2,4,5,1,2,6,4,8,5,7,2,4,5,1,2],
           'col2' : [5,6,1,4,5,4,5,1,5,4,5,6,4,5,8,4]}
    
    df = pd.DataFrame(data)
    df_M = [x for _, x in df.groupby(['Main'])]
    for i in df_M:
        fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(12,6), 
    sharex=True,linewidth=1, edgecolor='black')
        df_S = [z for _, z in i.groupby(['Sub'])]
        for j in df_S:
            for col in j.columns.values[3:5]:
                ax.plot(j[col])
                plt.show()
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   fam-woodpecker    2 年前

    您需要在 axes 对象,即 axes[0,0] 在子图中2x2网格的第一行和第一列的轴上绘制。

    编辑 添加日期作为x轴

    import matplotlib.pyplot as plt
    import pandas as pd
    
    data = {
        "Date": [2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,],
        "Main": ["A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B",],
        "Sub": ["A1","A1","A2","A2","A3","A3","A4","A4","B1","B1","B2","B2","B3","B3","B4","B4",],
        "col1": [1, 2, 4, 5, 1, 2, 6, 4, 8, 5, 7, 2, 4, 5, 1, 2],
        "col2": [5, 6, 1, 4, 5, 4, 5, 1, 5, 4, 5, 6, 4, 5, 8, 4],
    }
    
    df = pd.DataFrame(data)
    df_M = [x for _, x in df.groupby(["Main"])]
    
    
    for groupName, groupdf in df.groupby(["Main"]):
        fig, axes = plt.subplots(
            nrows=2, ncols=2, figsize=(12, 6), sharex=True, linewidth=1, edgecolor="black"
        )
    
        for idx, (subGroupName, subGroupdf) in enumerate(groupdf.groupby(["Sub"])):
            row = 0 if idx < 2 else 1
            col = idx % 2
            for plottingCol in subGroupdf.columns.values[3:5]:
                axes[row, col].plot(subGroupdf.Date, subGroupdf[plottingCol])
    
        plt.show()