pandas(10):數據增刪改


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

# 數據
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=['測試'])


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM