【问题标题】:How to change header row in a python dataframe如何更改python数据框中的标题行
【发布时间】:2018-08-23 03:56:10
【问题描述】:

我在使用 python 中的 pandas 更改现有 DataFrame 中的标题行时遇到问题。导入 pandas 和 csv 文件后,我将标题行设置为 None,以便能够在转置后删除重复的日期。然而,这给我留下了一个我不想要的行标题(实际上是一个索引列)。

df = pd.read_csv(spreadfile, header=None)

df2 = df.T.drop_duplicates([0], take_last=True)
del df2[1]

indcol = df2.ix[:,0]
df3 = df2.reindex(indcol)

上述缺乏想象力的代码在两个方面都失败了。索引列现在是必需的,但是所有条目现在都是 NaN。我对 python 的理解还不够好,无法识别 python 在做什么。下面的所需输出是我需要的,任何帮助将不胜感激!

重新索引前的df2:

     0             2             3             4             5
0        NaN  XS0089553282  XS0089773484  XS0092157600  XS0092541969
1  01-May-14         131.7         165.1         151.8          88.9
3  02-May-14           131         164.9         151.7          88.5
5  05-May-14         131.1           165         151.8          88.6
7  06-May-14         129.9         163.4         151.2          87.1

重新索引后的df2:

             0    2    3    4    5
0                                 
NaN        NaN  NaN  NaN  NaN  NaN
01-May-14  NaN  NaN  NaN  NaN  NaN
02-May-14  NaN  NaN  NaN  NaN  NaN
05-May-14  NaN  NaN  NaN  NaN  NaN
06-May-14  NaN  NaN  NaN  NaN  NaN

需要df2:

       XS0089553282  XS0089773484  XS0092157600  XS0092541969
01-May-14         131.7         165.1         151.8          88.9
02-May-14           131         164.9         151.7          88.5
05-May-14         131.1           165         151.8          88.6
06-May-14         129.9         163.4         151.2          87.1

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    直接分配列:

    indcol = df2.ix[:,0]
    df2.columns = indcol
    

    reindex 的问题在于它会使用您的 df 的现有索引和列值,因此您传入的新列值不存在,因此您得到所有​​ NaNs

    一个更简单的方法来做你想做的事:

    In [147]:
    # take the cols and index values of interest
    cols = df.loc[0, '2':]
    idx = df['0'].iloc[1:]
    print(cols)
    print(idx)
    
    2    XS0089553282
    3    XS0089773484
    4    XS0092157600
    5    XS0092541969
    Name: 0, dtype: object
    
    1    01-May-14
    3    02-May-14
    5    05-May-14
    7    06-May-14
    Name: 0, dtype: object
    
    In [157]:
    # drop the first row and the first column
    df2 = df.drop('0', axis=1).drop(0)
    # overwrite the index values
    df2.index = idx.values
    df2
    
    Out[157]:
                   2      3      4     5
    01-May-14  131.7  165.1  151.8  88.9
    02-May-14    131  164.9  151.7  88.5
    05-May-14  131.1    165  151.8  88.6
    06-May-14  129.9  163.4  151.2  87.1
    
    In [158]:
    # now overwrite the column values    
    df2.columns = cols.values
    df2
    
    Out[158]:
              XS0089553282 XS0089773484 XS0092157600 XS0092541969
    01-May-14        131.7        165.1        151.8         88.9
    02-May-14          131        164.9        151.7         88.5
    05-May-14        131.1          165        151.8         88.6
    06-May-14        129.9        163.4        151.2         87.1
    

    【讨论】:

      【解决方案2】:
      In [310]:
      cols = df.iloc[0 , 1:]
      cols
      Out[310]:
      1    XS0089553282
      2    XS0089773484
      3    XS0092157600
      4    XS0092541969
      Name: 0, dtype: object
      
      In [311]:
      df.drop(0 , inplace=True)
      df
      Out[311]:
                 0    1       2          3    4
      1   01-May-14   131.7   165.1   151.8   88.9
      2   02-May-14   131     164.9   151.7   88.5
      3   05-May-14   131.1   165     151.8   88.6
      4   06-May-14   129.9   163.4   151.2   87.1
      
      In [312]:
      df.set_index(0 , inplace=True)
      df
      
      Out[312]:
          0           1   2           3   4       
      01-May-14   131.7   165.1   151.8   88.9
      02-May-14   131     164.9   151.7   88.5
      05-May-14   131.1   165     151.8   88.6
      06-May-14   129.9   163.4   151.2   87.1
      
      In [315]:
      
      df
      df.columns = cols
      df
      Out[315]:
                  XS0089553282    XS0089773484    XS0092157600    XS0092541969                
      01-May-14   131.7                  165.1    151.8           88.9
      02-May-14   131                    164.9    151.7           88.5
      05-May-14   131.1                    165    151.8           88.6
      06-May-14   129.9                  163.4    151.2           87.1
      

      【讨论】:

      • inplace = True 为我生成一个错误:TypeError: drop() got an unexpected keyword argument 'inplace'
      • 这个错误表明没有名称为inplace 的方法drop 的参数当然不是这种情况,我不确定这个,你确定你遵循相同的步骤?
      • 我再次尝试过同样的事情,这真的很奇怪,因为 set_index 有 inplace 参数。 df.drop 的唯一参数是标签、轴和级别。
      • 好的,暂时排除这个参数没问题,但是你需要将函数的结果分配给相同的df,就像这样df = df.set_index(0)
      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 2023-03-15
      • 1970-01-01
      • 2021-07-02
      • 2022-01-07
      • 2015-11-28
      • 2019-03-08
      • 2023-02-07
      相关资源
      最近更新 更多