前言
首先,我們創(chuàng)建一個(gè)5行4列的DataFrame數(shù)據(jù)作為示例,進(jìn)行演示
import pandas as pdimport numpy as np df = pd.DataFrame(data=np.arange(20).reshape(5,4), columns=['a', 'b', 'c', 'd'])df a b c d0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 154 16 17 18 19
一 部分列重命名
有時(shí)候,我們只需要將部分列的列名重命名??梢允褂米值涞姆绞剑闹付ǖ牧忻?。
df.rename(columns={'a': 'A'})A b c d0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 154 16 17 18 19
沒有指定inplace=True, df本身的列名并沒有改變。
df a b c d0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 154 16 17 18 19
這種情況下比較適合不變原有數(shù)據(jù),通過賦值對新數(shù)據(jù)列改名,如下:
df2 = df.rename(columns={'a': 'A'})df2 A b c d0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 154 16 17 18 19
如果我們指定inplace=True,則會改變原始數(shù)據(jù)
df.rename(columns={'a': 'A', 'c': 'C', 'd': 'D'}, inplace=True)df A b C D0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 154 16 17 18 19
二 全部列重命名
df.columns = new_columns, new_coumns 可以是列表或元組, 但新舊列名的長度必須一致,否者會不匹配報(bào)錯(cuò)。這種改變方式是直接改變了原始數(shù)據(jù)。
df.columns = ['a1', 'b1', 'c1', 'd1']df a1 b1 c1 d10 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 154 16 17 18 19
三 str 批量修改列名
將列名’a1’, ‘b1’… 批量改為’a2’, 'b2’…
df.columns = df.columns.str.replace('1', '2')df a2 b2 c2 d20 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 154 16 17 18 19
其實(shí)str的原理和第二章是一樣的,不同的是,我們對列名進(jìn)行了字符串的操作。
四 讀取csv文件重命名
names = new_columns, 在讀取文件的時(shí)候直接重命名列名。
df = pd.read_csv('xxx.csv', names=new_columns, header=0)
后記
這里講一個(gè)之前在讀csv文件, 重命名時(shí),踩到的一個(gè)小坑。
以前讀csv文件,讀到重命名時(shí),我都是先讀文件,轉(zhuǎn)成DataFrame之后再重命名的。
df = pd.read_csv('xxx.csv')df.columns = new_columns
這樣做,大部分情況下不會有什么問題,直到有天我讀的是無列名的csv文件。pandas默認(rèn)將第一行數(shù)據(jù)作為了列名。這時(shí)我再進(jìn)行df.columns = new_columns 時(shí),第一行數(shù)據(jù)就會因?yàn)樽鳛榱忻?,被new_columns替換了。這就導(dǎo)致我第一行數(shù)據(jù)白白丟失了(想哭)。今天寫這篇博客的目的。也就是想記住這個(gè)坑。
pandas的read_csv() 函數(shù),其實(shí)還踩過很多坑,里面有很多參數(shù),我會在之后的博客里詳解read_csv()的各個(gè)參數(shù)的用法。