目錄
一個資料框包含索引和資料,可以對索引和資料進行操作。原始資料框:
# 資料
index = [['a','a','b','b'],[1,2,3,4],[4,3,2,1]]
dict = {
'姓名':['任*','江*','陳*','羅*'],
'數學':[67,81,81,62],
'語文':[71,91,67,61]
}
df = pd.DataFrame(data=dict,index=index)
df
一、對索引進行操作
索引常見的屬性:索引值、索引名稱、索引型別等。
1 操作索引值df.rename()
df.rename(mapper=None, index=None, columns=None,
axis=None, copy=True, inplace=False, level=None)
引數說明: |
- mapper:dict or function,對映關係,可以是字典,也可以是一個函式。
- index、columns、axis:3個引數作用類似,用來控制軸向,預設為行。
- copy:預設為True,拷貝底層資料。
- level :int,level name,default none,針對多層索引,控制操作的索引層級。
df.rename(index = mapper) 等價於 df.rename(mapper)
df.rename(columns=mapper) 等價於 df.rename(mapper,axis=1)
# 傳入字典
df.rename({2:222})
# 傳入函式
df.rename(lambda x: str(x) + '_t')
# 指定軸向,方式一
df.rename(lambda x: x + '_t',axis=1)
# 指定軸向,方式二
df.rename(columns=lambda x: x + '_t')
# 指定索引層級
df.rename(index={1:'tt'},level=2)
備註:也可以用df.set_axis()將所需的索引更新給給定的軸。參考網站:https://www.cjavapy.com/article/772/
二、指定資料替換、修改df.replace()
可以全表替換df.replace() ,或只替換某列df[col]replace()。
df.replace(to_replace=None, value=None, inplace=False,
limit=None, regex=False, method='pad')
引數說明: |
- to_replace: str, regex, list, dict, Series, int, float, or None。被替換的值
- value:替換後的值
- inplace:是否要改變原資料,False是不改變,True是改變,預設是False
- limit:控制填充次數,和method引數搭配使用。
- regex:是否使用正則,False是不使用,True是使用,預設是False
- method:填充方式,pad,ffill,bfill,預設為pad。pad/ffill向前填充,用前一個值填充;bfill向後填充。設定這個引數後,就不用了設定替換的值value了。
# 某1列
df['數學'].replace(67,100)
# 某幾列
df[['數學','語文']].replace(67,100)
# 某1行
df.iloc[0].replace(67,100)
# 某幾行
df.iloc[0:3].replace(67,100)
# 整個資料框,所有61換成100
df.replace(61,100)
# 多對一對映,67和61都換成100
df.replace([67,61], 100)
# 一對一對映,67->100,61->99,對應替換
df.replace([67,61],[100,99])
# 向前填充,
# 設定method時,只需要傳入被替換的值
# df.replace(np.nan,method='bfill') # method引數一般用於填充空值
df.replace(81,method='pad')
# 向後填充
df.replace(81,method='bfill')
# 傳入字典一一對應
df.replace({67: 100,61: 99})
# 修改指定列的指定值,
df.replace({'姓名': '任*','數學': 81}, 100)
# 巢狀字典,指定列的值一一對應修改
df.replace({'姓名':{'任*':99, '江*': 100}})
# 限制填充個數,結合method引數使用
df.replace(81,limit=1)
# 使用正規表示式,regex=True
#用r''表示''內部的字串預設不轉義
df.replace(r'[\u4E00-\u9FA5]\W','正則',regex=True)
三、特殊值——缺失值處理
對於空值,pandas有專門刪除函式df.dropna()和填充函式df.fillna(0)。
跳轉連線:缺失值處理
四、新增行列
1 直接賦值新增新列
# 增加一列,全是100
df['英語'] = 100
# 根據已存列,計算新列
df['總分'] = df['數學'] + df['語文'] + df['英語']
# 推薦使用.loc的方式來賦值一列,直接用df[xxx]=的方式在某些情況會出現警告(鏈式)
df.loc[:, '測試'] = 'test'
# 根據其他列條件新增列
df.loc[df['數學']>= 80 ,'數學優秀'] = '優良'
2 df.assign()函式新增新列
df.assign(**kwargs)
返回值:一個新的DataFrame物件。注意新增的列名不加引號。
# 新增一列,返回是新的DataFrame物件,改變原DF,需要賦值生效
df.assign(性別='男')
# df = df.assign(性別='男')
# 計算增加列
df.assign(t1=df['語文']-df['數學'])
# lambda表示式
df.assign(t2=lambda x: x['數學']*1.2+15)
# 邏輯判斷,返回bool值:True or False
df.assign(t3=df['數學']>df['語文'])
# 型別轉換,返回1 或 0
df.assign(t4=(df['數學']>df['語文']).astype(int))
# map對映,返回指定值
df.assign(t5=(df['數學']>df['語文']).map({True:'大於',False:'小於'}))
# 同時增加多列,且列之間有關聯
df.assign(col1=lambda x: x['數學']*5,
col2 = lambda x: x['語文']*5,
col3 = lambda x: x['col1'] - x['col2']) # col1和col2沒有直接生效,不能直接用df['col1']
3 df.eval()函式新增新列
df.eval(expr, inplace=False, **kwargs)
引數說明: |
- expr:str,字串計算評估表示式,表示式可以直接使用列名
- inplace:預設為False
- 可以接受關鍵引數
返回:ndarray、標量、pandas物件。根據表示式計算列關係,可以指定列名生成新列。
# 直接使用列名,返回series
df.eval('語文 + 數學')
# 生成新列,返回DataFrame
df.eval('e1 = 語文 + 數學')
# df.eval('e1 = 語文 + 數學',inplace=True) 立即生效
# 生成兩列,有依賴關係,必須用三引號
df.eval("""c2 = 語文 + 數學
c2_1 = c2 + 英語"""
)
temp = df['語文'].mean()
# 使用外部變數
df.eval('e2 = 數學 - @temp')
# 邏輯判斷,True or False
df.eval('e3 = 10 < (數學 - @temp)')
4 df.insert()任意位置插入新列
可以根據列索引位置插入新列。參考網站:df.insert()
5 依據新索引插入新行
6 df.append()追加新行
7 pd.concat()通過拼接的方式加新行
五、刪除行列
1 df.pop()直接刪除某列
刪除某一列(不能是多列),只有一個引數,就是列名,傳入str引數。返回:被刪除的列,原df直接處理。
2 df.drop()刪除指定多行或多列
df.drop(labels=None, axis=0, index=None, columns=None,
level=None, inplace=False, errors='raise')
通過指定標籤名稱和相應的軸,或直接指定索引或列名稱,刪除行或列。使用多索引時,可以通過指定級別來刪除不同級別上的標籤。
引數說明: |
- labels:要刪除的列或者行,多個傳入列表
- axis:軸的方向,0為行,1為列,預設為0
- index:單個標籤或類似列表,指定軸的替代方法(labels, axis=0 等價於 index=labels)
- columns:單標籤或類似列表,指定軸的替代方法(labels, axis=1 等價於 columns=labels)
- level:int或級別名稱,可選,對於MultiIndex,將從中刪除標籤的級別。
- inplace:
- errors:{'ignore','raise'},預設為'raise',如果'ignore',則抑制錯誤,僅刪除現有標籤 。
# 刪除列
df.drop(['數學','語文'],axis=1)
# df.drop(columns=['數學','語文']) 等價
# 刪除a層級的所有行
df.drop(['a'])
# 刪除第2層級的,索引為1的行
df.drop(index=1,level=1)
# 刪除行列:刪除b層級所有行和‘測試這一列’
df.drop(index='b',columns=['測試'])