【问题标题】:How can I make pandas dataframe column headers all lowercase?如何使熊猫数据框列标题全部小写?
【发布时间】:2013-11-12 14:39:16
【问题描述】:

我想让我的 pandas 数据框中的所有列标题都小写

示例

如果我有:

data =

  country country isocode  year     XRAT          tcgdp
0  Canada             CAN  2001  1.54876   924909.44207
1  Canada             CAN  2002  1.56932   957299.91586
2  Canada             CAN  2003  1.40105  1016902.00180
....

我想通过执行以下操作将 XRAT 更改为 xrat:

data.headers.lowercase()

所以我得到:

  country country isocode  year     xrat          tcgdp
0  Canada             CAN  2001  1.54876   924909.44207
1  Canada             CAN  2002  1.56932   957299.91586
2  Canada             CAN  2003  1.40105  1016902.00180
3  Canada             CAN  2004  1.30102  1096000.35500
....

我不会提前知道每个列标题的名称。

【问题讨论】:

  • 更简单的df.columns = df.columns.str.lower()
  • 你好 Nasuki,虽然在最初的问题出现时原始答案是可以接受的,但下面的 answer 更好。请考虑将其标记为已接受的答案。最好的问候。

标签: python pandas dataframe


【解决方案1】:

你可以这样做:

data.columns = map(str.lower, data.columns)

data.columns = [x.lower() for x in data.columns]

示例:

>>> data = pd.DataFrame({'A':range(3), 'B':range(3,0,-1), 'C':list('abc')})
>>> data
   A  B  C
0  0  3  a
1  1  2  b
2  2  1  c
>>> data.columns = map(str.lower, data.columns)
>>> data
   a  b  c
0  0  3  a
1  1  2  b
2  2  1  c

【讨论】:

  • 请注意,当 lower(column1) == lower(column2)(例如,'a' 和 'A')时,这会导致列名重复。这可能会在稍后引用列时产生意想不到的后果。 (例如 data['a'] 将返回一个 DataFrame,而不是一个 Series,所有列都名为 'a')。有关示例,请参阅此要点:gist.github.com/grisaitis/170e82a008480acb4fa3
  • [x.lower() for x in data.columns] 等价于:[x.lower() for x in data]
  • 当您使用它时,最好使用[x.lower().strip() for x in df0]
  • @PawelKranzberg 你知道如何降低MultiIndex的列名
  • @curious_nustian - 是的,例如:df.index.names = [x.lower().strip() for x in df.index.names]
【解决方案2】:

如果你想使用链式方法调用来重命名,你可以使用

data.rename(
    columns=unicode.lower
)

(Python 2)

data.rename(
    columns=str.lower
)

(Python 3)

【讨论】:

    【解决方案3】:

    您可以使用str.lowercolumns 轻松做到这一点:

    df.columns = df.columns.str.lower()
    

    例子:

    In [63]: df
    Out[63]: 
      country country isocode  year     XRAT         tcgdp
    0  Canada             CAN  2001  1.54876  9.249094e+05
    1  Canada             CAN  2002  1.56932  9.572999e+05
    2  Canada             CAN  2003  1.40105  1.016902e+06
    
    In [64]: df.columns = df.columns.str.lower()
    
    In [65]: df
    Out[65]: 
      country country isocode  year     xrat         tcgdp
    0  Canada             CAN  2001  1.54876  9.249094e+05
    1  Canada             CAN  2002  1.56932  9.572999e+05
    2  Canada             CAN  2003  1.40105  1.016902e+06
    

    【讨论】:

      【解决方案4】:
      df.columns = df.columns.str.lower()
      

      是最简单的,但如果某些标头是数字会报错

      如果你有数字标题,那么使用这个:

      df.columns = [str(x).lower() for x in df.columns]
      

      【讨论】:

      • 我想在这种情况下写df.columns.astype(str).str.lower() 更容易,但可能有点冗长。
      【解决方案5】:

      我注意到如果列名由数字组成(例如“123”),其他一些答案将失败。尝试这些也可以处理此类情况。

      选项 1:使用df.rename

      def rename_col(old_name):
          return str(old_name).lower()
      
      df.rename(rename_col)
      

      选项 2(来自this comment):

      df.columns.astype(str).str.lower()
      

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 1970-01-01
        • 2016-08-09
        • 2019-01-13
        • 2018-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        相关资源
        最近更新 更多