【问题标题】:Google Colab - pandas/pyplot will only accept column references not titlesGoogle Colab - pandas/pyplot 将只接受列引用而不是标题
【发布时间】:2021-01-12 02:24:47
【问题描述】:

我在 Colab 中使用 gspread 打开了一个 Google 表格

document = gc.open_by_url('https://docs.google.com/myspreadsheet')

sheet = elem.worksheet('Sheet1')

data = sheet.get_all_values()

df = pd.DataFrame(data)

文档包含元素数据,打印的 head() 如下所示:


             0          1   ...              26               27
0  AtomicNumber    Element  ...  NumberofShells  NumberofValence
1             1   Hydrogen  ...               1                1
2             2     Helium  ...               1                 
3             3    Lithium  ...               2                1
4             4  Beryllium  ...               2                2

我遇到的问题是,当我尝试按标题引用时,例如:

df.plot(x = 'AtomicNumber', y= 'AtomicMass', kind = 'scatter')

我得到一个错误。我也试过:

df.plot(x = df.AtomicNumber, y= df.AtomicMass, kind = 'scatter')

df.plot(x = df['AtomicNumber'], y= df['AtomicMass'], kind = 'scatter')

但我也没有快乐。除非我像这样使用列引用:

df.plot(x = 0, y= 17, kind = 'scatter')

我什么也得不到。如果我必须继续引用 .csv 文件来确定我需要哪个列引用,它会很快变得很累!!

最后,当我打印时:

df.columns.values

我明白了:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27])

我似乎无法明白这一点 - 即使我尝试创建一个包含 df bar row index 0 每一行的新数据框

我对此很陌生,所以我确信它很简单,但我陷入了僵局......帮助!

【问题讨论】:

    标签: python pandas matplotlib google-colaboratory gspread


    【解决方案1】:

    我刚刚想出了一个解决方案,对此我很满意,所以我会将这个问题标记为已解决。

    问题似乎出在我创建数据框的方式上:

    data = sheet.get_all_values()
    
    df = pd.DataFrame(data)
    

    如果我改为使用 'Get_all_records()' 函数,则生成的数据框没有看似不可移动的列参考号作为标题(见下文)

    df = pd.DataFrame(raw.get_all_records())
    

    当我打印这个数据帧的 head() 时,我得到:

       AtomicNumber    Element Symbol  ...  SpecificHeat  NumberofShells  NumberofValence
    0             1   Hydrogen      H  ...        14.304               1                1
    1             2     Helium     He  ...         5.193               1                 
    2             3    Lithium     Li  ...         3.582               2                1
    3             4  Beryllium     Be  ...         1.825               2                2
    4             5      Boron      B  ...         1.026               2                3
    

    然后当我调用 df.columns.values 时,我得到:

    array(['AtomicNumber', 'Element', 'Symbol', 'AtomicMass',
           'NumberofNeutrons', 'NumberofProtons', 'NumberofElectrons',
           'Period', 'Group', 'Phase', 'Radioactive', 'Natural', 'Metal',
           'Nonmetal', 'Metalloid', 'Type', 'AtomicRadius',
           'Electronegativity', 'FirstIonization', 'Density', 'MeltingPoint',
           'BoilingPoint', 'NumberOfIsotopes', 'Discoverer', 'Year',
           'SpecificHeat', 'NumberofShells', 'NumberofValence'], dtype=object)
    

    我现在将深入研究 gspread 的文档,并尝试找出 get_all_values 和 get_all_records 之间的区别,但我很高兴能够弄清楚! :-)

    【讨论】:

      【解决方案2】:

      看来,该工作表文件包含作为第一行编号,用作列名。在将工作表转换为数据框之前,您需要删除第一行。我对 gspread API 不是很熟悉,但假设以下应该可以工作:

       data = sheet.get_all_values()[1:]
      

      之后应该可以按名称寻址列。

      【讨论】:

      • 嘿 - 非常感谢您花时间回答。我已经尝试使用 FirstTwenty = df[1:21] 创建一个新的数据结构,但没有成功。我回到这里是因为我刚刚想通了(或一种方法)。我在这里很新,但我想我可以将它添加为任何找到此问题的人的答案,然后将其标记为已解决?我现在试试。再次感谢您的宝贵时间!
      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2014-07-10
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多