pandas(10):資料增刪改

發表於2021-05-09

一個資料框包含索引和資料,可以對索引和資料進行操作。原始資料框:

# 資料
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

image

一、對索引進行操作

索引常見的屬性:索引值、索引名稱、索引型別等。

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)

image
備註:也可以用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了。
    image
# 某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=['測試'])

相關文章