【问题标题】:Select several rows and plot two columns in python from a csv从csv中选择几行并在python中绘制两列
【发布时间】:2021-07-08 20:02:20
【问题描述】:

我有一个 5 列 36 行的 CSV。第一列有一个名称,第二列和第三列在 X(波长)和 Y(反射率)轴上有我想要的两个幅度。我希望能够选择不同的行并绘制它们的波长与反射率,但我不知道如何为任何给定行选择两列。 csv 格式如下:

Name,_xx,_yy,Source,Spectometer

Seawater_open_ocean,"[205,213,...]","[0.0360,0.0360,...]",UGSG,BECK

我只写了这个:

import pandas as pd
import matplotlib.pyplot as plt
import csv

x=[]
y=[]

df = pd.read_csv('albedos.csv')
df.set_index('Name', inplace=True)

for row in df:
    x.append((row[2]))
    y.append((row[3]))

print(df.loc[['Dry_sand','Wet_sand','Old_road']])

plt.plot(x,y, marker='o')

plt.title('Spectrum')

plt.xlabel('Wavelength')
plt.ylabel('Reflectance')

plt.show()

我不知道如何让它为每个索引元素选择 _xx 和 _yy 列并绘制它。我对编程很陌生,所以也许这很容易,但还没有发现这个特定问题在这里得到解决。我希望它看起来与此相似:

1

【问题讨论】:

    标签: python pandas csv plot


    【解决方案1】:

    数据框的结构使您的绘图任务变得困难。

    我建议您首先告诉 read_csv 它应该将 _xx_yy 中的字符串评估为原生列表:

     df = pd.read_csv('albedos.csv', converters={'_xx': eval, '_yy':eval})
    

    假设这个数据框中只有一行:

                      Name         _xx             _yy Source Spectometer
    0  Seawater_open_ocean  [205, 213]  [0.036, 0.036]   UGSG        BECK
    

    您可以像这样扩展_xx_yy

    exploded_df = df[['Name', '_xx', '_yy']].set_index(['Name']).apply(pd.Series.explode).reset_index()
    

    得到

                      Name  _xx    _yy
    0  Seawater_open_ocean  205  0.036
    1  Seawater_open_ocean  213  0.036
    

    我假设从那里通过过滤每个名称来绘制数据不会有任何困难。

    【讨论】:

      【解决方案2】:
      • 您的示例数据缺少构建示例...已合成一些
      • 最重要的步骤是将编码为字符串的列表转换为使用apply(json.loads) 的实际列表
      • 假设您已经 set_index().loc[] 中使用它来识别您的坐标
      • 切换到创建图形和轴,然后添加每一行
      import matplotlib.pyplot as plt
      import pandas as pd
      import io, json
      
      df = pd.read_csv(io.StringIO("""Name,_xx,_yy,Source,Spectometer
      Dry_sand,"[190,193]","[0.0360,0.0370]",UGSG,BECK
      Seawater_open_ocean,"[205,213]","[0.0360,0.0360]",UGSG,BECK"""), sep=",")
      
      df["_xx"] = df["_xx"].apply(json.loads)
      df["_yy"] = df["_yy"].apply(json.loads)
      df.set_index("Name", inplace=True)
      
      fig, ax = plt.subplots(figsize=[4,4])
      
      # plot two lines... array specifies keys
      for l in ["Seawater_open_ocean", "Dry_sand"]:
          ax.plot(df.loc[l,"_xx"], df.loc[l,"_yy"])
      
      ax.set_title('Spectrum')
      ax.set_xlabel('Wavelength')
      ax.set_ylabel('Reflectance')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        相关资源
        最近更新 更多