重命名pandas中的列

时间:2012-07-05 14:21:15

标签: python pandas replace dataframe rename

我有一个使用pandas和列标签的DataFrame,我需要编辑它来替换原始列标签。

我想更改原始列名称所在的DataFrame A中的列名:

['$a', '$b', '$c', '$d', '$e'] 

['a', 'b', 'c', 'd', 'e'].

我将已编辑的列名存储在列表中,但我不知道如何替换列名。

33 个答案:

答案 0 :(得分:2283)

RENAME SPECIFIC COLUMNS

使用df.rename()功能并引用要重命名的列。并非所有列都必须重命名:

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

最小代码示例

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

以下方法都可以工作并产生相同的输出:

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)  # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'})  # old method  

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

请记住将结果分配回去,因为修改不在原地。或者,指定inplace=True

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

从v0.25开始,如果指定了无效的列重命名,您还可以指定errors='raise'来引发错误。请参阅v0.25 rename() docs


REASSIGN COLUMN HEADERS

df.set_axis()axis=1inplace=False一起使用(以返回副本)。

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

这会返回一个副本,但您可以通过设置inplace=True就地修改DataFrame(这是版本的默认行为< = 0.24,但将来可能会更改)。

您也可以直接指定标题:

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

答案 1 :(得分:1445)

只需将其分配到.columns属性:

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

答案 2 :(得分:347)

rename方法可以采用函数,例如:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

答案 3 :(得分:153)

http://pandas.pydata.org/pandas-docs/stable/text.html中所述:

df.columns = df.columns.str.replace('$','')

答案 4 :(得分:151)

Pandas 0.21+回答

版本0.21中的列重命名有一些重要更新。

  • this tutorial添加了axis参数,该参数可设置为columns1。此更新使此方法与其余的pandas API匹配。它仍然具有indexcolumns参数,但您不再被迫使用它们。
  • inplace设置为False的{​​{3}}可让您使用列表重命名所有索引或列标签。

Pandas 0.21 +

的例子

构造示例DataFrame:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

renameaxis='columns'axis=1

一起使用
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

两者都会产生以下结果:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

仍然可以使用旧方法签名:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

rename函数还接受将应用于每个列名称的函数。

df.rename(lambda x: x[1:], axis='columns')

df.rename(lambda x: x[1:], axis=1)

set_axis与列表和inplace=False

一起使用

您可以为set_axis方法提供一个列表,该列表的长度与列数(或索引)相等。目前,inplace默认为True,但inplace将在以后的版本中默认为False

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

为什么不使用df.columns = ['a', 'b', 'c', 'd', 'e']

像这样直接分配列没有任何问题。这是一个非常好的解决方案。

使用set_axis的优点是它可以用作方法链的一部分,并返回DataFrame的新副本。没有它,您必须在重新分配列之前将链的中间步骤存储到另一个变量。

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

答案 5 :(得分:124)

由于您只想删除所有列名称中的$符号,您可以这样做:

df = df.rename(columns=lambda x: x.replace('$', ''))

OR

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

答案 6 :(得分:72)

df.columns = ['a', 'b', 'c', 'd', 'e']

它将按您提供的顺序用您提供的名称替换现有名称。

答案 7 :(得分:56)

old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

这样您就可以根据需要手动编辑new_names。 当您只需要重命名几列以纠正错误拼写,重音,删除特殊字符等时,效果很好。

答案 8 :(得分:49)

我认为这种方法很有用:

ImageView's

此方法允许您单独更改列名称。

答案 9 :(得分:40)

重命名熊猫中的列很容易。

df.rename(columns={'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}, inplace=True)

答案 10 :(得分:33)

列名称与系列名称

我想解释一下幕后发生的事情。

数据框是一组系列。

系列又是numpy.array

的扩展

numpy.array有一个属性.name

这是该系列的名称。很少有熊猫尊重这个属性,但它在某些地方徘徊,可以用来破解一些熊猫行为。

命名列的列表

这里的很多答案都说明df.columns属性为list,而实际上它是Series。这意味着它具有.name属性。

如果您决定填写列Series

的名称,会发生这种情况
df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index       
0                                    4           1
1                                    5           2
2                                    6           3

请注意,索引的名称总是低一列。

徘徊

的工件

.name属性有时会持续存在。如果您设置df.columns = ['one', 'two'],则df.one.name将为'one'

如果您设置df.one.name = 'three',那么df.columns仍然会为您提供['one', 'two'],而df.one.name会给您'three'

BUT

pd.DataFrame(df.one)将返回

    three
0       1
1       2
2       3

因为pandas重用已定义的.name的{​​{1}}。

多级列名

Pandas有办法做多层列名。没有那么多魔术涉及但我想在我的回答中也涵盖这个,因为我没有看到有人在这里接受这个。

Series

通过将列设置为列表可以轻松实现这一点,如下所示:

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

答案 11 :(得分:32)

一行或管道解决方案

我将专注于两件事:

  1. OP明确说明

      

    我将已编辑的列名存储在列表中,但我不知道如何替换列名。

    我不想解决如何替换'$'或从每个列标题中删除第一个字符的问题。 OP已经完成了这一步。相反,我想专注于使用给定替换列名列表的新对象替换现有的columns对象。

  2. df.columns = new其中new是新列名称的列表,就像它获得的一样简单。这种方法的缺点是它需要编辑现有数据框的columns属性,而不是内联。我将通过流水线技术展示一些方法来执行此操作,而无需编辑现有的数据框。

  3. 设置1
    为了专注于使用预先存在的列表重命名替换列名称的需要,我将创建一个新的示例数据框df,其中包含初始列名和不相关的新列名。

    df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
    new = ['x098', 'y765', 'z432']
    
    df
    
       Jack  Mahesh  Xin
    0     1       3    5
    1     2       4    6
    

    解决方案1 ​​
    pd.DataFrame.rename

    已经说过如果你有一个将旧列名称映射到新列名的字典,你可以使用pd.DataFrame.rename

    d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
    df.rename(columns=d)
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    但是,您可以轻松创建该词典并将其包含在rename的调用中。以下利用以下事实:当迭代df时,我们迭代每个列名。

    # given just a list of new column names
    df.rename(columns=dict(zip(df, new)))
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    如果原始列名称是唯一的,则此方法很有用。但如果他们不这样做,那么就会崩溃。

    设置2
    非唯一列

    df = pd.DataFrame(
        [[1, 3, 5], [2, 4, 6]],
        columns=['Mahesh', 'Mahesh', 'Xin']
    )
    new = ['x098', 'y765', 'z432']
    
    df
    
       Mahesh  Mahesh  Xin
    0       1       3    5
    1       2       4    6
    

    解决方案2
    pd.concat使用keys参数

    首先,请注意当我们尝试使用解决方案1时会发生什么:

    df.rename(columns=dict(zip(df, new)))
    
       y765  y765  z432
    0     1     3     5
    1     2     4     6
    

    我们没有将new列表映射为列名。我们最后重复y765。相反,我们可以在迭代keys的列时使用pd.concat函数的df参数。

    pd.concat([c for _, c in df.items()], axis=1, keys=new) 
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    解决方案3
    重建。仅当您对所有列都有一个dtype时才应使用此选项。否则,您最终会为所有列添加dtype object并将其转换回来需要更多字典工作。

    dtype

    pd.DataFrame(df.values, df.index, new)
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    混合dtype

    pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    解决方案4
    这是transposeset_index的花哨技巧。 pd.DataFrame.set_index允许我们设置内联索引,但没有相应的set_columns。所以我们可以转置,然后set_index,并转置回来。但是,解决方案3中的相同单dtype与混合dtype警告适用于此处。

    dtype

    df.T.set_index(np.asarray(new)).T
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    混合dtype

    df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    解决方案5
    使用lambda中的pd.DataFrame.rename循环遍历new的每个元素 在这个解决方案中,我们传递一个lambda,它接受x但忽略它。它也需要y但不期望它。相反,迭代器是作为默认值给出的,然后我可以使用它一次循环一个,而不考虑x的值。

    df.rename(columns=lambda x, y=iter(new): next(y))
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

    正如 sopython 聊天中的人们指出的那样,如果我在*x之间添加y,我可以保护我的y变量。虽然,在这种情况下,我不相信它需要保护。值得一提的是。

    df.rename(columns=lambda x, *, y=iter(new): next(y))
    
       x098  y765  z432
    0     1     3     5
    1     2     4     6
    

答案 12 :(得分:20)

让我们通过一个小例子来了解重命名...

1。使用映射重命名列:

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) #creating a df with column name A and B
df.rename({"A": "new_a", "B": "new_b"},axis='columns',inplace =True) #renaming column A with 'new_a' and B with 'new_b'

output:
   new_a  new_b
0  1       4
1  2       5
2  3       6

2。使用映射重命名索引/行名:

df.rename({0: "x", 1: "y", 2: "z"},axis='index',inplace =True) #Row name are getting replaced by 'x','y','z'.

output:
       new_a  new_b
    x  1       4
    y  2       5
    z  3       6

答案 13 :(得分:16)

df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})

如果新的列列表与现有列的顺序相同,则分配很简单:

new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
   a  b  c  d  e
0  1  1  1  1  1

如果您将旧列名称上的字典键入新列名称,则可以执行以下操作:

d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col])  # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
   a  b  c  d  e
0  1  1  1  1  1

如果您没有列表或字典映射,则可以通过列表理解去除前导$符号:

df.columns = [col[1:] if col[0] == '$' else col for col in df]

答案 14 :(得分:16)

df = df.rename(columns=lambda n: n.replace('$', '')) 是一种解决这个问题的功能性方法

答案 15 :(得分:15)

如果您有数据框,df.columns会将所有内容转储到您可以操作的列表中,然后将其作为列的名称重新分配到您的数据框中......

columns = df.columns
columns = [row.replace("$","") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() #to validate the output

最好的方式? IDK。一种方式 - 是的。

评估问题答案中提出的所有主要技术的更好方法是使用cProfile来计算内存和数据。执行时间处理时间。 @kadee,@ kaitlyn,& @eumiro具有执行时间最快的功能 - 尽管这些功能如此之快,我们正在比较所有答案的.000和.001秒的舍入。道德:我上面的答案可能不是“最佳”方式。

import pandas as pd
import cProfile, pstats, re

old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b','$c':'c','$d':'d','$e':'e'}

df = pd.DataFrame({'$a':[1,2], '$b': [10,20],'$c':['bleep','blorp'],'$d':[1,2],'$e':['texa$','']})

df.head()

def eumiro(df,nn):
    df.columns = nn
    #This direct renaming approach is duplicated in methodology in several other answers: 
    return df

def lexual1(df):
    return df.rename(columns=col_dict)

def lexual2(df,col_dict):
    return df.rename(columns=col_dict, inplace=True)

def Panda_Master_Hayden(df):
    return df.rename(columns=lambda x: x[1:], inplace=True)

def paulo1(df):
    return df.rename(columns=lambda x: x.replace('$', ''))

def paulo2(df):
    return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

def migloo(df,on,nn):
    return df.rename(columns=dict(zip(on, nn)), inplace=True)

def kadee(df):
    return df.columns.str.replace('$','')

def awo(df):
    columns = df.columns
    columns = [row.replace("$","") for row in columns]
    return df.rename(columns=dict(zip(columns, '')), inplace=True)

def kaitlyn(df):
    df.columns = [col.strip('$') for col in df.columns]
    return df

print 'eumiro'
cProfile.run('eumiro(df,new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df,col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df,old_names,new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')

答案 16 :(得分:14)

答案 17 :(得分:10)

我知道这个问题和答案已被咀嚼致死。但我提到它是为了解决我遇到的问题之一。我能够使用来自不同答案的点点滴滴来解决它,从而在有人需要时提供我的回复。

我的方法是通用的,您可以通过逗号分隔'not found'变量和面向未来的变量来添加其他分隔符。

工作代码:

delimiters=

<强>输出:

import pandas as pd
import re


df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

答案 18 :(得分:9)

您可以使用str.slice

df.columns = df.columns.str.slice(1)

答案 19 :(得分:9)

真正的简单只需使用

df.columns = ['Name1', 'Name2', 'Name3'...]

它将按照您放置的顺序分配列名

答案 20 :(得分:9)

假设这是您的数据框。

enter image description here

您可以使用两种方法重命名列。

  1. 使用dataframe.columns=[#list]

    df.columns=['a','b','c','d','e']
    

    enter image description here

    此方法的局限性在于,如果必须更改一列,则必须传递完整的列列表。同样,此方法不适用于索引标签。 例如,如果您通过以下操作:

    df.columns = ['a','b','c','d']
    

    这将引发错误。长度不匹配:预期轴有5个元素,新值有4个元素。

  2. 另一种方法是Pandas rename()方法,该方法用于重命名任何索引,列或行

    df = df.rename(columns={'$a':'a'})
    

    enter image description here

类似地,您可以更改任何行或列。

答案 21 :(得分:8)

除了已经提供的解决方案之外,您还可以在读取文件时替换所有列。我们可以使用namesheader=0来做到这一点。

首先,我们创建一个我们希望用作列名的名称列表:

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

在这种情况下,所有列名称都将替换为列表中的名称。

答案 22 :(得分:7)

请注意,这些方法不适用于MultiIndex。对于MultiIndex,您需要执行以下操作:

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

答案 23 :(得分:7)

另一个选择是使用正则表达式重命名:

import pandas as pd
import re

df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})

df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

答案 24 :(得分:4)

我需要为XGBoost重命名功能,它不喜欢其中任何一个:

import re
regex = r"[!\"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~ ]+"
X_trn.columns = X_trn.columns.str.replace(regex, '_', regex=True)
X_tst.columns = X_tst.columns.str.replace(regex, '_', regex=True)

答案 25 :(得分:3)

这是一个非常棒的小功能,我喜欢用它来减少打字:

<form name="surecollect" id="surecollect" method="post" action="https://testpti.payserv.net/webpaymentv2/default.aspx">
    <input type="hidden" name="paymentrequest" value="<?php echo $b64string; ?>">
    <input type="submit" name="submit" value="Submit">
</form>

以下是其工作原理的示例:

def rename(data, oldnames, newname): 
    if type(oldnames) == str: #input can be a string or list of strings 
        oldnames = [oldnames] #when renaming multiple columns 
        newname = [newname] #make sure you pass the corresponding list of new names
    i = 0 
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0: 
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: #doesn't have to be an exact match 
            print("Found multiple columns that matched " + str(name) + " :")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1 
    return data   

答案 26 :(得分:3)

如果你不得不处理由提供系统命名的大量列,你提出了以下方法,即一次性方法和特定替换的组合。

我首先使用正则表达式从数据框列名创建一个字典,以便丢弃列名的某些附录 然后我将特定的替换添加到字典中,以便在接收数据库中稍后按预期命名核心列。

然后一次性将其应用于数据帧。

dict=dict(zip(df.columns,df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)','')))
dict['brand_timeseries:C1']='BTS'
dict['respid:L']='RespID'
dict['country:C1']='CountryID
dict['pim1:D']='pim_actual'
df.rename(columns=dict, inplace=True)

答案 27 :(得分:1)

如果您已经有了新列名称的列表,您可以试试这个:

new_names = ['a', 'b', 'c', 'd', 'e']
new_names_map = {df.columns[i]:new_cols[i] for i in range(len(new_cols))}

df.rename(new_names_map, axis=1, inplace=True)

答案 28 :(得分:0)

假设您可以使用正则表达式。该解决方案无需使用正则表达式进行手动编码

| publisher   |
| ----------- |
| Century Fox |
| DC          |

答案 29 :(得分:0)

如果您只想删除“$”符号,请使用以下代码

df.columns = pd.Series(df.columns.str.replace("$", ""))

答案 30 :(得分:0)

假设您的数据集名称是 df,而 df 是。

df = ['$a', '$b', '$c', '$d', '$e']`

所以,要重命名这些,我们只需要做。

df.columns = ['a','b','c','d','e']

答案 31 :(得分:0)

许多 Pandas 函数都有一个 inplace 参数。将其设置为 True 时,转换直接应用于您调用它的数据帧。例如:

var httpntlm = require('httpntlm');

httpntlm.get({
    url: "https://www.yucata.de",
    username: 'user',
    password: 'password',
    workstation: 'yucata',
    domain: 'www.yucata.de'
}, function (err, res){
    if(err) return err;

    console.log(res.headers);
    console.log(res.body);
});

或者,在某些情况下您希望保留原始数据帧。如果创建数据框是一项昂贵的任务,我经常看到人们陷入这种情况。例如,如果创建数据框需要查询雪花数据库。在这种情况下,只需确保将 inplace 参数设置为 False。

df = pd.DataFrame({'$a':[1,2], '$b': [3,4]})
df.rename(columns={'$a': 'a'}, inplace=True)
df.columns

>>> Index(['a', '$b'], dtype='object')

如果您经常进行这些类型的转换,您还可以查看许多不同的 Pandas GUI 工具。我是一个名为 Mito 的创建者。它是一个电子表格,可自动将您的编辑转换为 Python 代码。

答案 32 :(得分:0)

This way it will work
import pandas as pd

# Define a dictionary 
rankings = {'test': ['a'],
        'odi': ['E'],
        't20': ['P']}

# Convert the dictionary into DataFrame
rankings_pd = pd.DataFrame(rankings)

# Before renaming the columns
print(rankings_pd)

rankings_pd.rename(columns = {'test':'TEST'}, inplace = True)