我有一个叫data的数据框架。如何重命名仅有的一个列标题?比如gdp to log(gdp)?
data =
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
我有一个叫data的数据框架。如何重命名仅有的一个列标题?比如gdp to log(gdp)?
data =
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
当前回答
如果需要重命名单个列,则使用list-comprehension是一种更快的实现。
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
如果需要重命名多个列,可以使用如下条件表达式:
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
或者,使用字典构造一个映射,并通过将默认值设置为旧名称来执行它的get操作的list-comprehension:
col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name
df.columns = [col_dict.get(x, x) for x in df.columns]
计时:
%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop
%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop
其他回答
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)
重命名表明它接受dict作为列的参数,因此您只需传递一个带有单个条目的dict。
另见相关
Ewe可以重命名表
df = pd.DataFrame()
column_names = mydataframe.columns
for i in range(len(mydataframe)):
column = mydataframe.iloc[:,i]
df[column_names[i][:-8]+"desigred_texnt"] = column
print(df.columns)
如果需要重命名单个列,则使用list-comprehension是一种更快的实现。
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
如果需要重命名多个列,可以使用如下条件表达式:
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
或者,使用字典构造一个映射,并通过将默认值设置为旧名称来执行它的get操作的list-comprehension:
col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name
df.columns = [col_dict.get(x, x) for x in df.columns]
计时:
%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop
%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop
df.rename(columns=lambda x: {"My_sample": "My_sample_new_name"}.get(x, x))
如何重命名熊猫中的特定列?
从v0.24+开始,要一次重命名一个(或多个)列,
带有axis=1或axis='columns'的datafframe .rename() (axis参数是在v0.21中引入的。 Index.str.replace()用于基于字符串/正则表达式的替换。
如果您需要一次重命名所有列,
DataFrame.set_axis()方法,axis=1。传递一个类似列表的序列。也可以进行就地修改。
重命名为axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
使用0.21+,你现在可以用rename指定一个轴参数:
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
(注意,在默认情况下,rename没有到位,因此需要将结果赋值回去。)
这样做是为了提高与API其余部分的一致性。new axis参数类似于columns参数——它们做同样的事情。
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Rename还接受为每列调用一次的回调。
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
对于这个特定的场景,您可能希望使用
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Index.str.replace
类似于python中的字符串替换方法,pandas Index和Series(仅对象dtype)为字符串和基于正则表达式的替换定义了一个(“向量化的”)str.replace方法。
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
与其他方法相比,此方法的优点是str.replace支持regex(默认启用)。更多信息请参见文档。
向set_axis传递一个axis=1的列表
用一个头列表调用set_axis。列表的长度必须等于列/索引的大小。set_axis默认情况下会改变原始的DataFrame,但您可以指定inplace=False以返回修改后的副本。
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
注意:在以后的版本中,inplace将默认为True。
方法链接 当我们已经有了df分配列的有效方法时,为什么还要选择set_axis。列=…?正如Ted Petrou在回答中所示,set_axis在尝试链接方法时非常有用。
比较
# 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()
前者是更自然和自由流动的语法。