目錄
1.dataframe修改行列值
2.dataframe新增列
3.drop刪除指定行列
4.replace取代值
5.sort_values排序
6.merge合併列或寫入行
7.append寫入行
8.concat合併列或寫入行
9.update跨表更新
1.dataframe修改行列值
df.values[i][j]= xxx #其中i是行號,j是列號,都是從0開始
df.values[1]=12 # 把第2行資料設為12
df['a'] = 12 # 如果指定的列名不存在,會新增列
1)使用ix函式
df_obj.ix[1:3,[1,3]]=1 #所選位置資料取代為1
2)修改具體元素值
data['four'][1]=50 #注意行名在先
3)修改列值
data['three']=1
4)修改行值
data[2:]=1 #把第3行及以後行的值設為1
5)鏈式賦值採用loc
df1.loc[df1.A<0.3, 'B'] = 1 #正常執行,而df1[df1.A<0.3]['B'] = 1會報SettingWithCopyWarning,且值不會修改
2.dataframe新增列
(1)整列賦單值
data['five']=9
(2)由已知列生成新列
data['qty2'] = data['qty']**3 #單列運算生成
df['col']=df['col1']+df['col2'] #多欄運算生成
(3)使用df.apply函式
def padn(a,b):
if a >= 10000 and b=='male':
return 'yes'
elif a>8000 and b=='female':
return 'yes'
else:
return 'no'
df['fh']=df.apply(lambda x: padn(x.revenue,x.sex), axis = 1)
df['col3'] = df.apply(lambda x: x['col1'] + 2 * x['col2'], axis=1)
(4)使用df.map函式
1)使用自定義函式
def square(x):
return (x ** 2)
data['qty2'] = data['qty'].map(square)
2)使用匿名函式
data['qty2'] = data['qty'].map(lambda x: x**2)
(5)使用df.assign函式
例1
import pandas as pd
df = pd.DataFrame({'temp_c': [17.0, 25.0]},index=['Portland', 'Berkeley'])
df.assign(temp_f=lambda x: x.temp_c * 9 / 5 + 32)
與上式等同效果
df.assign(temp_f=df['temp_c'] * 9 / 5 + 32)
例2
df.assign(temp_f=lambda x: x['temp_c'] * 9 / 5 + 32,temp_k=lambda x: (x['temp_f'] + 459.67) * 5 / 9)
# temp_c temp_f temp_k
# Portland 17.0 62.6 290.15
# Berkeley 25.0 77.0 298.15
例3
import pandas as pd
s=pd.Series([11,12,13],name='S')
data=np.arange(21,24)
df=pd.DataFrame({'A':[31,32,33],'B':[41,42,43]})
fun=lambda x:x.A+x.B
df.assign(C=fun,D=df.A+df.B,E=s,F=data)
# A B C D E F
# 0 31 41 72 72 11 21
# 1 32 42 74 74 12 22
# 2 33 43 76 76 13 23
(6)使用df.applymap函式
用法與apply相似,但作用於所有列
import pandas as pd
df = pd.DataFrame([[1, 2.12], [3.356, 4.567]])
df.applymap(lambda x: x**2)
3.drop刪除指定行列
(1)語法
使用pandas.DataFrame中的drop函式刪除dataframe中行或列
語法:drop(labels, axis=0, level=None, inplace=False, errors='raise')
labels:指定索引名或列名
axis:預設為0,當axis=0,刪除行資料,當axis=1時,刪除列資料
(2)範例
1)刪除行
刪除單行: data=data.drop('Ohio',axis =0)
刪除多行: data=data.drop(['Ohio','Colorado'],axis =0)
df.drop(['a','b'],inplace=True) ##刪除a和b行
2)刪除列
刪除單列: data=data.drop('Ohio',axis =1)
刪除多欄: data=data.drop(['Ohio','Colorado'],axis =1)
3)使用del函式
只可以刪除單列:del data['two'] #two為列名
4.replace取代值
DataFrame.replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
#單值取代
df.replace('?',np.nan) #用np.nan取代?
df.replace({'?':'NA'}) #用NA取代?
#按列指定單值取代
df.replace({'EMPNO':'?'},np.nan)#用np.nan取代EMPNO列中?
df.replace({'EMPNO':'?','ENAME':'.'},np.nan)#用np.nan取代EMPNO列中?和ENAME中.
#多值取代
df.replace(['?','.','$'],[np.nan,'NA','None'])##用np.nan取代?用NA取代. 用None取代$
df.replace({'?':'NA','$':None})#用NA取代? 用None取代$
df.replace({'?','$'},{'NA',None})#用NA取代? 用None取代$
#正則取代
df.replace(r'?|.|$',np.nan,regex=True)#用np.nan取代?或.或$原字元
df.replace([r'?',r'$'],np.nan,regex=True)#用np.nan取代?和$
df.replace([r'?',r'$'],[np.nan,'NA'],regex=True)#用np.nan取代?用NA取代$符號
df.replace(regex={r'?':None})
5.sort_values排序
(1)df.sort_values()行或列排序
sort_values既可以列排序,也可以行排序
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
axis:{0 or 'index』, 1 or 'columns』}, default 0
# 預設按照索引排序,即縱向排序,如果為1,則是橫向排序
by:str or list of str;
# 如果axis=0,那麼by="列名";如果axis=1,那麼by="行名";
ascending:布林型,True則升序
# 可以是[True,False],即第一欄位升序,第二個降序
inplace:布林型
# 是否用排序後的資料框取代現有的資料框
kind: default quicksort
# 排序方法,{'quicksort』, 'mergesort』, 'heapsort』},
na_position : default last
# 預設缺失值排在最後面 {'first』, 'last』}
import pandas as pd
list1=[['B1', '2019-12-01', 3], ['B1', '2019-12-01', 8],['A1', '2019-12-02', 4],['A1','2019-12-09', 5]]
data=pd.DataFrame(list1,columns=('asin','date','qty'))
#實現按qty排序
data.sort_values(by='qty',axis=0,ascending=False)
#實現按asin與qty排序,降序
data.sort_values(by=['asin','qty'],axis=0,ascending=False)
#依據第一列排序,並將該列空值放在首位
df.sort_values(by=['col1'],na_position='first')
#依據第二、三列,數值降序排序
df.sort_values(by=['col2','col3'],ascending=False)
df.sort_values(by=['col2','col3'],ascending=[False,True])
#根據第一列中數值排序,按降序排列,並取代原資料
df.sort_values(by=['col1'],ascending=False,inplace=True,na_position='first')
(2)sort_index() 行排序
sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
axis:0按照行名排序;1按照列名排序
level:預設None,否則按照給定的level順序排列---貌似並不是,檔案
ascending:預設True升序排列;False降序排列
inplace:預設False,否則排序之後的資料直接取代原來的資料框
kind:預設quicksort,排序的方法
na_position:缺失值預設排在最後{"first","last"}
by:按照那一列資料進行排序,但是by引數貌似不建議使用
data.sort_index(by=['asin','qty'],axis=0,ascending=False)
#排序後取代原來的資料
data.sort_index(by=['asin','qty'],axis=0,ascending=False,inplace=True)
6.merge合併列或寫入行
(1)merge語法說明
DataFrame.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
left 參與合併的左側DataFrame
right 參與合併的右側DataFrame
how 連接方式:'inner'(預設);還有,'outer'、'left'、'right'
on 用於連接的列名,必須同時存在於左右兩個DataFrame物件中,如果位指定,則以left和right列名的交集作為連接鍵
left_on 左側DataFarme中用作連接鍵的列
right_on 右側DataFarme中用作連接鍵的列
left_index 將左側的行索引用作其連接鍵
right_index 將右側的行索引用作其連接鍵
sort 根據連接鍵對合併後的資料進行排序,預設為True。有時在處理巨量資料集時,禁用該選項可獲得更好的效能
suffixes 字串值元組,用於新增到重疊列名的末尾,預設為('_x','_y').例如,左右兩個DataFrame物件都有'data',則結果中就會出現'data_x','data_y'
copy 設定為False,可以在某些特殊情況下避免將資料複製到結果資料結構中。預設總是賦值
(2)merge連接樣例
df = pd.merge(df1, df2, how='left', on='name') #左連接,關連列名相同
df = pd.merge(df1, df2, how='inner', on='name') #內連接,關連列名相同
df = pd.merge(df1, df2, how='outer', on='name') #全連接,關連列名相同
df = pd.merge(df1, df2, how='left', left_on='name1',right_on='name2') #左連接,關連列名不相同
df = pd.merge(df1, df2, how='inner', left_on='name1',right_on='name2') #內連接,關連列名不相同
df=df1.merge(df2,on='name',how='left')
df=df1.merge(df2,left_on='name',right_on='name',how='left')
df=pd.merge(df1,df2,on=['key1','key2'],how='outer') #全連接,多鍵值連接
df=pd.merge(A_df, B_df, how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2']) #全連接,多鍵值連接
#範例
import pandas as pd
list1=[['B1', '2019-12-01', 3], ['B2', '2019-12-01', 8],['A1', '2019-12-02', 4],[None,None, 5]]
data=pd.DataFrame(list1,columns=('asin','date','qty'))
price=pd.DataFrame([['A1',12.2],['B1',14.5]],columns=('asin','price'))
#注意匹配不上的行,或空值行
df=data.merge(price,how='left',on='asin')
# asin date qty price
# 0 B1 2019-12-01 3 14.5
# 1 B2 2019-12-01 8 NaN
# 2 A1 2019-12-02 4 12.2
# 3 None None 5 NaN
7.append寫入行
語法引數
DataFrame.append(self, other, ignore_index=False, verify_integrity=False, sort=None)
# other:DataFrame、series、dict、list這樣的資料結構
# ignore_index:預設值為False,如果為True則不使用index標籤
# verify_integrity :預設值為False,如果為True當建立相同的index時會丟擲ValueError的異常
# sort:boolean,預設是None,該屬性在pandas的0.23.0的版本才存在。
import pandas as pd
df1=pd.DataFrame([['B1', '2019-12-01', 3], ['B2', '2019-12-01', 8]],columns=('asin','date','qty'))
df2=pd.DataFrame([['A1', '2019-12-02', 4],[None,None, 5]],columns=('asin','date','qty'))
df=df1.append(df2, ignore_index=True)
# asin date qty
# 0 B1 2019-12-01 3
# 1 B2 2019-12-01 8
# 2 A1 2019-12-02 4
# 3 None None 5
8.concat合併列或寫入行
pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None,names=None, verify_integrity=False, copy=True)
axis=0, 對行操作 ,
axis=1,對列操作
join='outer', 連接各個資料,
join='inner',只取各個資料的公共部分
join_axes=[df1.index],保留與df1的行標籤一樣的資料,配合axis=1一起用 ,join_axes=[df1.columns],保留與df1的列標籤一樣的資料,不要新增axis=1
ignore_index=False, 保留原索引,ignore_index=True,忽略原索引並生成新索引
keys=['x', 'y', 'z'] 對組成的每個df重新新增個索引
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},index=[8, 9, 10, 11])
df = pd.concat([df1,df2,df3])
# A B C D
# 0 A0 B0 C0 D0
# 1 A1 B1 C1 D1
# 2 A2 B2 C2 D2
# 3 A3 B3 C3 D3
# 4 A4 B4 C4 D4
# 5 A5 B5 C5 D5
# 6 A6 B6 C6 D6
# 7 A7 B7 C7 D7
# 8 A8 B8 C8 D8
# 9 A9 B9 C9 D9
# 10 A10 B10 C10 D10
# 11 A11 B11 C11 D11
9.update跨表更新
(1)語法引數
df.update(other, join='left', overwrite=True, filter_func=None, raise_conflict=False)
用另一個DataFrame中的非NA值進行就地修改
引數:
other:DataFrame,至少有一個匹配的索引/列標籤;Series必設name屬性
join:{'left'}僅實現左連接,保留原始物件的索引和列
overwrite =True:處理重疊鍵(行索引)非NA值:
* True:覆蓋原始df值
* False:僅更新原始df中na的值
filter_func:callable(1d-array) - > boolean 1d-array
可取代NA以外值。回傳True表示值應該更新。函式引數作用於df
raise_conflict=False:為True,則會在df和other同一位置都是非na值時引發ValueError
2.範例
例項1.1:
df = pd.DataFrame({'A': [11, 12, 13],'B': [14, 15, 16]})
new_df = pd.DataFrame({'B': [21, 22,23],'C': [24, 25, 26]})
df.update(new_df)
df
A B
0 11 21
1 12 22
2 13 23
例項1.2:df長度不會增加,僅更新匹配的索引/列標籤處的值。
df = pd.DataFrame({'A': ['a1', 'a2', 'a3'], 'B': ['b1', 'b2', 'b3']})
new_df = pd.DataFrame({'B': ['c1', 'c2', 'c3', 'c4', 'c5']})
df.update(new_df)
df
A B
0 a1 c1
1 a2 c2
2 a3 c3
例項1.3:
df = pd.DataFrame({'A': [11, 12, 13],'B': [14, 15, 16]})
new_df = pd.DataFrame({'B': ['c1', 'c2', 'c3', 'c4', 'c5']})
df.update(new_df)
df
A B
0 11 c1
1 12 c2
2 13 c3
例項2.1:對於Series,必須設定其name屬性。
df = pd.DataFrame({'A': ['a1', 'a2', 'a3'], 'B': ['b1', 'b2', 'b3']})
new_column = pd.Series(['c1', 'c3'], name='B', index=[0, 2])
df.update(new_column)
df
A B
0 a1 c1
1 a2 b2
2 a3 c3
例項2.2:
df = pd.DataFrame({'A': ['a1', 'a2', 'a3'], 'B': ['b1', 'b2', 'b3']})
new_column = pd.Series(['c2', 'c3'], name='B', index=[1, 2])
df.update(new_column)
df
A B
0 a1 b1
1 a2 c2
2 a3 c3
例項3:如果other包含NaN,則不會更新df的值
df = pd.DataFrame({'A': [11, 12, 13],'B': [14, 15, 16]})
new_df = pd.DataFrame({'B': [24, np.nan, 26]})
df.update(new_df)
df
A B
0 11 24.0
1 12 15.0
2 13 26.0
例項4:過濾函式df>=15的值被替代
df = pd.DataFrame({'A': [11, 12, 13],'B': [14, 15, 16]})
new_df = pd.DataFrame({'B': [21, 22,23],'C': [24, 25, 26]})
df.update(new_df,filter_func=lambda s:s>=15)
df
A B
0 11 14
1 12 22
2 13 23
例項5.1:overwrite重複行索引
df = pd.DataFrame({'A': [11, 12, 13],'B': [14, np.nan, 16]},index=[0,1,1])
new_df = pd.DataFrame({'B': [21, 22,23],'C': [24, 25, 26]})
df.update(new_df)
df
A B
0 11 21.0
1 12 22.0
1 13 22.0
例項5.2:
df = pd.DataFrame({'A': [11, 12, 13],'B': [14, np.nan, 16]},index=[0,1,1])
new_df = pd.DataFrame({'B': [21, 22,23],'C': [24, 25, 26]})
df.update(new_df,overwrite=True)
df
A B
0 11 21.0
1 12 22.0
1 13 22.0
例項6.1:
df = pd.DataFrame({'A': [11, 12],'B': [np.nan, np.nan]})
new_df = pd.DataFrame({'B': [21, 22],'C': [24, 25]})
df.update(new_df,raise_conflict=True)
df
A B
0 11 21.0
1 12 22.0
例項6.2:
df = pd.DataFrame({'A': [11, 12],'B': [13, np.nan]})
new_df = pd.DataFrame({'B': [21, 22],'C': [24, 25]})
df.update(new_df,raise_conflict=True)
ValueError;df和other同一位置都是非na值時引發ValueError