【问题标题】:Renaming columns in a list of dataframes?重命名数据框列表中的列?
【发布时间】:2017-12-28 17:26:38
【问题描述】:

我有一个看起来像这样的 DataFrame 列表,

dfs

 [                   
    var1       var1  
 14.171250  13.593813
 13.578317  13.595329
 10.301850  13.580139
 9.930217   13.593278
 6.192517   13.561943
 7.738100   13.565149
 6.197983   13.572509,                  
   var1       var2    
 2.456183  5.907528
 5.052017  5.955731
 5.960000  5.972480
 8.039317  5.984608
 7.559217  5.985348
 6.933633  5.979438
 ...
 ]

我想将每个 DataFrame 中的 var1var2 重命名为 FooHoo。 我tried以下,

renames_dfs = []
for df in dfs:
    renames_dfs.append(df.rename(columns={'var1':'Foo','var2':'Hoo'},inplace = True))

这将返回一个空列表 None。当我重命名列名时,我在这里犯了什么错误?

【问题讨论】:

  • 只删除inplace = True,它返回None
  • 完美!成功了!
  • 或者,df.columns = ['Foo', 'Hoo']
  • 根据我的链接我不应该有inplace = True吗?
  • @i.n.n.m 您可以通过直接分配给列来绕过它。 inplace 将更新参考。

标签: python pandas dataframe rename


【解决方案1】:

您现有的代码返回None,因为inplace=True 就地更新了引用。

一种有效的解决方案是直接分配给df.columns

for df in dfs:
    df.columns = ['foo', 'bar']

将更新同一列表中的所有数据框,而无需创建新列表。


另一个选项是使用set_axis,如果您要重命名所有列:

df2 = [df.columns.set_axis(['foo', 'bar'], axis=1, inplace=False) for df in dfs]

如果只重命名一个子集,请改用rename

【讨论】:

    【解决方案2】:

    你可以这样做。

    [df.rename(columns={'var1':'Foo','var2':'Hoo'},inplace=True) for df in dfs]
    

    输出:

    [None,None]
    

    但是....

    dfs
    

    输出:

    [        Foo       Hoo
     0  0.463904  0.765987
     1  0.473314  0.609793
     2  0.505549  0.449539
     3  0.508157  0.444993
     4  0.604366  0.368044,         Foo       Hoo
     0  0.241526  0.225990
     1  0.609949  0.454891
     2  0.523094  0.443431
     3  0.525026  0.714601
     4  0.002260  0.763454]
    

    【讨论】:

    • Nooo.... 不要使用列表推导来产生副作用。这是一种反模式。
    • @cᴏʟᴅsᴘᴇᴇᴅ,你介意解释一下那些“副作用”吗?
    • @MaxU 基本上,这里的列表 comp 的唯一目的是除了组成列表之外做一些事情。列表的实际内容被丢弃,但为创建它而采取的操作会对其他内容产生影响——副作用。
    • @MaxU 只是说这不是你通常想做的事情。一开始不是很地道。不过我猜这只是我的看法:)
    【解决方案3】:

    参数inplace=True总是返回None

    所以你可以使用:

    renames_dfs = []
    for df in dfs:
        df.rename(columns={'var1':'Foo','var2':'Hoo'},inplace = True)
        renames_dfs.append(df)
    

    但我认为更好:

    renames_dfs = []
    for df in dfs:
        renames_dfs.append(df.rename(columns={'var1':'Foo','var2':'Hoo'}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 2020-08-30
      • 2014-10-26
      • 2018-01-04
      • 2014-09-20
      • 2021-02-03
      • 2021-12-19
      • 2018-12-21
      相关资源
      最近更新 更多