【问题标题】:How to reindex a pandas dataframe within a function?如何在函数中重新索引熊猫数据框?
【发布时间】:2019-06-10 17:49:23
【问题描述】:

我正在尝试将具有空值的列标题添加到我的数据框 (just like this answer),但在已经修改它的函数中,如下所示:

mydf = pd.DataFrame()

def myfunc(df):
  df['newcol1'] = np.nan  # this works

  list_of_newcols = ['newcol2', 'newcol3']
  df = df.reindex(columns=df.columns.tolist() + list_of_newcols)  # this does not
  return
myfunc(mydf)

如果我在 IPython 控制台中单独运行这些行,它将添加它们。但是作为脚本运行,newcol1 将被添加,但 2 和 3 不会。设置copy=False 也不起作用。我在这里做错了什么?

【问题讨论】:

    标签: python pandas dataframe reindex


    【解决方案1】:

    Pandas df.reindex() 会生成一个新对象,除非索引相同,因此您需要从函数中返回新对象。

    def myfunc(df):
      df['newcol1'] = np.nan  # this works
    
      list_of_newcols = ['newcol2', 'newcol3']
      df = df.reindex(columns=df.columns.tolist + list_of_newcols)  # this does not
      return df
    
    mydf = myfunc(mydf)
    

    【讨论】:

    • 那么索引等效的唯一情况是我重新排列现有的列标签?
    • @ExcelHelp 我相信是这样,但我并不肯定。
    • 实际上没有 - 返回一个副本,除非请求的索引实际上等于原始索引。
    【解决方案2】:

    不确定这是您使用实际代码时还是在此处输入时所犯的错误,但tolist() 是一个函数,您必须添加括号。

    df = df.reindex(columns=df.columns.tolist() + list_of_newcols)
    

    【讨论】:

      【解决方案3】:

      您无需设置NaN 值并再次指定新的列标签。您可以reindex 使用任意字符串列表; NaN是未指定数据的默认值。

      df = pd.DataFrame({'A': [1, 2, 3]})
      
      df = df.reindex(columns=['A', 'B', 'C'])
      
      print(df)
      
         A   B   C
      0  1 NaN NaN
      1  2 NaN NaN
      2  3 NaN NaN
      

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 2016-06-13
        • 2018-08-24
        • 2022-07-10
        • 2017-12-14
        • 2013-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多