pandas之数据修改与基本运算方式
作者:蚂蚁*漫步
1.数据复制
- 直接赋值
直接赋值的话,只是复制的元数据(行列索引),但是元素还是存储在相同内存位置 对元素进行修改会影响另外一个。
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(12).reshape(4,3),index=list("abcd"),columns=['w','y','z']) print(df) print(df.iloc[1,2]) df.iloc[1,2]=20 print(df.iloc[1,2]) out: w y z a 0 1 2 b 3 4 5 c 6 7 8 d 9 10 11 5-------->>赋值之前 20-------->>赋值之后
- copy()函数。
copy函数,复制原数据(行列索引),还创建新的存储位置 对元素进行修改不影响另外一个。
df=pd.DataFrame(np.arange(12).reshape(4,3),index=list("abcd"),columns=['w','y','z']) print(df) df1=df.copy() print(df1.iloc[1,2]) df1.iloc[1,2]=20 print(df.iloc[1,2]) out: w y z a 0 1 2 b 3 4 5 c 6 7 8 d 9 10 11 5 5
2.增加行和列
通过[]操作符+列名方式增加多列 新增列在最后 df[['new_column1','new_column2',...]] =
通过loc+列名新增一列,不能新增多列 新增列在最后 pd.loc[:, 'new_column'] =
insert(loc, column, value, allow_duplicates=False)
- loc位置参数:0 <= loc <= len(columns)
- column:列名 新增列在中间,一次只能增加一列
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(12).reshape(4,3),index=list("abcd"),columns=['w','y','z']) print(df) df['n']=[3,7,9,11] df[['x','k']]=df[['w','z']] df.loc[:,'r']=[12,13,15,16] df.insert(1,'t',[31,56,78,5])------>>增加在第一列 print(df) out: w y z a 0 1 2 b 3 4 5 c 6 7 8 d 9 10 11 w t y z n x k r a 0 31 1 2 3 0 2 12 b 3 56 4 5 7 3 5 13 c 6 78 7 8 9 6 8 15 d 9 5 10 11 11 9 11 16
- 增加列。
新增行在最后 通过loc函数新增一行,不能新增多行 pd.loc['new-index'] =
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(12).reshape(4,3),index=list("abcd"),columns=['w','y','z']) print(df) df.loc['r']=[12,13,15] print(df) out: w y z a 0 1 2 b 3 4 5 c 6 7 8 d 9 10 11 w y z a 0 1 2 b 3 4 5 c 6 7 8 d 9 10 11 r 12 13 15
3.行列删除
Del 只能删除一列 ,语法:del df['column-name']
pd.drop() 可以删除多列
pd.drop(labels,axis=1, inplace=False)
- labels:行列名称列表
- axis:0表示删除行(默认),1表示删除列 ,
- inplace:False表示源DataFrame不变(默认,True表示原DataFrame改变
pd.pop() 只能删除一列并把删除的一列赋值给新的对象。
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(40).reshape(5,8),index=list("abcde"),columns=['w','y','z', 'l','m','n','o','p']) print(df) del df['w'] df.drop(labels=['y','l'],axis=1,inplace=True) print(df) data=df.pop('n') print(df) print(data) out: w y z l m n o p a 0 1 2 3 4 5 6 7 b 8 9 10 11 12 13 14 15 c 16 17 18 19 20 21 22 23 d 24 25 26 27 28 29 30 31 e 32 33 34 35 36 37 38 39 z m n o p a 2 4 5 6 7 b 10 12 13 14 15 c 18 20 21 22 23 d 26 28 29 30 31 e 34 36 37 38 39 z m o p a 2 4 6 7 b 10 12 14 15 c 18 20 22 23 d 26 28 30 31 e 34 36 38 39 a 5 b 13 c 21 d 29 e 37 Name: n, dtype: int32
- 重复值删除。
重复值查看 duplicated(subset=None, keep='first’) ,Subset 是否只需要检查某几列
- KeepFirst:支持从前向后, 将后出现的相同行判断为重复值
- Last:和从后向前
重复值删除
drop_duplicates(subset=None, keep=’first’, inplace=False)
import pandas as pd import numpy as np data=pd.DataFrame({'qu1':[1,3,4,3,4], 'qu2':[1,3,4,3,4], 'qu3':[1,3,2,3,3]}) print(data) print(data.duplicated(keep='first')) print(data.duplicated(keep='last')) print(data.drop_duplicates()) out: qu1 qu2 qu3 0 1 1 1 1 3 3 3 2 4 4 2 3 3 3 3 4 4 4 3 0 False 1 False 2 False 3 True 4 False dtype: bool 0 False 1 True 2 False 3 False 4 False dtype: bool qu1 qu2 qu3 0 1 1 1 1 3 3 3 2 4 4 2 4 4 4 3
4.改变索引
索引的不可变性,不能对索引的某个值直接进行修改。
整体重命名 pd.index =, pd.columns =
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(40).reshape(5,8),index=list("abcde"),columns=['w','y','z', 'l','m','n','o','p']) print(df.index) print(df.columns) df.index='new_'+df.index df.columns='new'+df.columns print(df.index) print(df.columns) out: Index(['a', 'b', 'c', 'd', 'e'], dtype='object') Index(['w', 'y', 'z', 'l', 'm', 'n', 'o', 'p'], dtype='object') Index(['new_a', 'new_b', 'new_c', 'new_d', 'new_e'], dtype='object') Index(['neww', 'newy', 'newz', 'newl', 'newm', 'newn', 'newo', 'newp'], dtype='object')
行列同时修改
rename(index=None, columns=None, **kwargs)
- index:修改行索引名称,dict示例为{‘oldname’:‘newname’, ...}
- columns:修改列索引名称
- inplace : boolean, default False(生成新对象)
- copy:inplace为False时生效,表示是否为新对象创建新的存储位置,否则只是生成元数据(行列索引)
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(40).reshape(5,8),index=list("abcde"),columns=['w','y','z', 'l','m','n','o','p']) print(df.index) print(df.columns) df.rename(index={'a':'a1','b':'b1'},columns={'w':'w1','l':'l1'},inplace=True) print(df.index) print(df.columns) out: Index(['a', 'b', 'c', 'd', 'e'], dtype='object') Index(['w', 'y', 'z', 'l', 'm', 'n', 'o', 'p'], dtype='object') Index(['a1', 'b1', 'c', 'd', 'e'], dtype='object') Index(['w1', 'y', 'z', 'l1', 'm', 'n', 'o', 'p'], dtype='object')
同时调整行或者列
reindex(index=None, columns=None, **kwargs)
- index:调整后的行索引名称列表
- columns:调整后的列索引名称列表
- fill_value:出现新的索引时默认的,method = ffill ffill/pad 前向填充,bfill/backfill 后向填充 。
# series reindex data1 = pd.Series(np.arange(4), index=list('ABCD')) print(s1) ''' A 1 B 2 C 3 D 4 dtype: int64 ''' # 重新指定 index, 多出来的index,可以使用fill_value 填充 print(s1.reindex(index=['A', 'B', 'C', 'D', 'E'], fill_value = 10)) ''' A 1 B 2 C 3 D 4 E 10 dtype: int64 ''' s2 = Series(['A', 'B', 'C'], index = [1, 5, 10]) print(s2) ''' 1 A 5 B 10 C dtype: object ''' # 修改索引, # 将s2的索引增加到15个 # 如果新增加的索引值不存在,默认为 Nan print(s2.reindex(index=range(15))) ''' 0 NaN 1 A 2 NaN 3 NaN 4 NaN 5 B 6 NaN 7 NaN 8 NaN 9 NaN 10 C 11 NaN 12 NaN 13 NaN 14 NaN dtype: object ''' # ffill : foreaward fill 向前填充, # 如果新增加索引的值不存在,那么按照前一个非nan的值填充进去 print(s2.reindex(index=range(15), method='ffill')) ''' 0 NaN 1 A 2 A 3 A 4 A 5 B 6 B 7 B 8 B 9 B 10 C 11 C 12 C 13 C 14 C dtype: object ''' # reindex dataframe df1 = DataFrame(np.random.rand(25).reshape([5, 5]), index=['A', 'B', 'D', 'E', 'F'], columns=['c1', 'c2', 'c3', 'c4', 'c5']) print(df1) ''' c1 c2 c3 c4 c5 A 0.700437 0.844187 0.676514 0.727858 0.951458 B 0.012703 0.413588 0.048813 0.099929 0.508066 D 0.200248 0.744154 0.192892 0.700845 0.293228 E 0.774479 0.005109 0.112858 0.110954 0.247668 F 0.023236 0.727321 0.340035 0.197503 0.909180 ''' # 为 dataframe 添加一个新的索引 # 可以看到 自动 扩充为 nan print(df1.reindex(index=['A', 'B', 'C', 'D', 'E', 'F'])) ''' 自动填充为 nan c1 c2 c3 c4 c5 A 0.700437 0.844187 0.676514 0.727858 0.951458 B 0.012703 0.413588 0.048813 0.099929 0.508066 C NaN NaN NaN NaN NaN D 0.200248 0.744154 0.192892 0.700845 0.293228 E 0.774479 0.005109 0.112858 0.110954 0.247668 F 0.023236 0.727321 0.340035 0.197503 0.909180 ''' # 扩充列, 也是一样的 print(df1.reindex(columns=['c1', 'c2', 'c3', 'c4', 'c5', 'c6'])) ''' c1 c2 c3 c4 c5 c6 A 0.700437 0.844187 0.676514 0.727858 0.951458 NaN B 0.012703 0.413588 0.048813 0.099929 0.508066 NaN D 0.200248 0.744154 0.192892 0.700845 0.293228 NaN E 0.774479 0.005109 0.112858 0.110954 0.247668 NaN F 0.023236 0.727321 0.340035 0.197503 0.909180 NaN ''' # 减小 index print(s1.reindex(['A', 'B'])) ''' 相当于一个切割效果 A 1 B 2 dtype: int64 ''' print(df1.reindex(index=['A', 'B'])) ''' 同样是一个切片的效果 c1 c2 c3 c4 c5 A 0.601977 0.619927 0.251234 0.305101 0.491200 B 0.244261 0.734863 0.569936 0.889996 0.017936 ————————————————
5.数据排序
- 索引排序。
pd.sort_index(axis=1, ascending=False, inplace=True)
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(9).reshape(3,3),index=list("acb"),columns=['w','m','z',]) print(df) df.sort_index(axis=0,ascending=True,inplace=True) print(df) out: w m z a 0 1 2 c 3 4 5 b 6 7 8 w m z a 0 1 2 b 6 7 8 c 3 4 5 df.sort_index(axis=1,ascending=True,inplace=True) print(df) out: m w z a 1 0 2 c 4 3 5 b 7 6 8
- 列值排序。
pd.sort_values(by='b', ascending=False, inplace=True)
import pandas as pd import numpy as np data=pd.DataFrame({'qu1':[1,7,41,3,4], 'qu2':[1,9,4,37,4], 'qu3':[1,12,25,3,37]}) print(data) data.sort_values(by='qu1',ascending=True,inplace=True) print(data) out: qu1 qu2 qu3 0 1 1 1 1 7 9 12 2 41 4 25 3 3 37 3 4 4 4 37 qu1 qu2 qu3 0 1 1 1 3 3 37 3 4 4 4 37 1 7 9 12 2 41 4 25
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。