【问题标题】:How to plot similarly named columns using pandas?如何使用熊猫绘制类似命名的列?
【发布时间】:2021-06-10 23:50:18
【问题描述】:

我读过一些使用 pandas 的 csv 文件。目前只有两个文件,但几周后我将处理数百个具有相同数据变量的 csv 文件。

我使用了一个 for 循环来读取文件并将数据帧附加到一个列表中,然后使用这个 for 循环来区分一些名称:

for i, df in enumerate(separate_data, 1):
    df.columns = [col_name+'_df{}'.format(i) for col_name in df.columns]

我的问题是,如何使用条形图比较文件之间的变量?例如,常见变量之一是温度,因此在区分列名后,我现在有了 temp_df1 和 temp_df2。我将如何调用所有温度列以在条形图中比较它们?

我尝试使用它,但无法让它工作:

for df in separate_data:
    temp_comp = separate_data.plot.bar(y='temp*')

【问题讨论】:

  • 你到底想在他们两个之间进行什么比较?绘图的 x 轴是什么?
  • 你想如何比较它们?每个条形图是文件的聚合还是每个文件的单独条形图?
  • x 轴是月份,1-12。我只想比较这些位置的变量的月平均值。所以只是 x 轴上的时间和 y 轴上的两个温度列。
  • 每个条都是一个文件的聚合。我将创建多个条形图,但这是比较不同的变量。比如,一张比较温度的条形图,一张比较降水量的条形图,一张比较湿度的条形图。图中的每个条形现在将代表一个文件。
  • 你能改变你阅读文件的方式吗?读入一个带有标识符列的数据帧会比多帧容易得多。

标签: python pandas csv plot


【解决方案1】:

如果可以的话,我会读入一个带有标识符的数据帧,以使聚合更容易。例如:

import pandas as pd

filenames = ["file_1.csv", "file_2.csv"]

df = pd.concat(
    [
        pd.read_csv(filename).assign(filename=filename.split(".")[0])
        for filename in filenames
    ]
)

df.groupby("filename")["column_to_plot"].mean().plot.bar()

【讨论】:

    【解决方案2】:

    假设您有以下三个数据框,每个数据框都有一个临时列。以下是您如何将临时列迭代地组合成一个新的数据框并绘制它们:

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df1 = pd.DataFrame({'temp':[100,150,200], 'pressure': [10,20,30]})
    df2 = pd.DataFrame({'temp':[50,70,100], 'pressure': [10,25,40]})
    df3 = pd.DataFrame({'temp':[110,80,120], 'pressure': [8,20,50]})
    df_list = [df1,df2,df3]
    
    df_combined = pd.DataFrame()
    for i, df in enumerate(df_list):
        df_combined[f'df{i+1}'] = df['temp']
    print('Combined Dataframe\n', df_combined)
    
    df_combined.plot(kind = 'bar')
    plt.ylabel('Temp')
    plt.show()
    
    #Combined Dataframe
        df1  df2  df3
    0  100   50  110
    1  150   70   80
    2  200  100  120
    

    请注意,这假设您的所有数据帧都具有相同的长度。如果这不是真的,您可以从每个数据帧中读取前 n(例如 50)行,以确保长度相等:

    df = pd.read_csv('sample.csv', nrows=50).
    

    【讨论】:

    • 不客气。请注意,这假设您的所有数据帧都具有相同的长度。如果这不是真的,您可以只读取每个数据帧的前 n 行,以确保长度相等,使用 df = pd.read_csv('sample.csv', nrows=50)。
    • 顺便说一下,欢迎来到 Stack Overflow。这里的礼仪是接受/赞成适合你的答案:stackoverflow.com/help/…
    猜你喜欢
    • 2021-09-29
    • 2018-05-26
    • 2017-03-20
    • 2020-07-04
    • 2020-08-27
    • 2021-10-25
    • 2021-08-15
    相关资源
    最近更新 更多