根据条件定位某个字段并赋值
data.loc[(data.Cabin.notnull()),'Cabin'] = 1 #将Cabin属性不为空的Cabin列赋值为1
Mean_age_Mr = data[data.Name.str.contains('Mr')]['Age'].mean() #求名字中有Mr的人的年龄的平均数
data.loc[(data['Name'].str.contains('Dr'))&data.Age.isnull(),'Age')] =Mr_age_Mr #对名字里包含Dr且年龄为空的进行赋值
合并数据集
Df1 = DataFrame({‘key’:[‘b’,’b’,’a’,’c’,’a’,’a’,’b’],’data1’:range(7)})
Df1 = DataFrame({‘key:[‘a’,’b’,’d’],’data2’:range(3)})
Pd.merge(df1,df2,on=’key’)
Pd.merge(df1,df2,left_on=’key’,right_on=’rkey’)
Pd.merge(df1,df2,left_on=’key’,right_on=’key’,how=’outer’)
重塑层次化索引
stack()
unstack()
移除重复数据
Data = DataFrame({‘k1’:[‘one’]*3+[‘two’]*4,’k2’:[1,1,2,3,3,4,4]})
Data.dupllicated() #返回一个布尔型的Series,表示各行是否为重复行
Data.drop_duplicates() #默认判断全部列
data[‘v1’] = range(7)
data.drop_duplicates([‘k1’])
利用函数或者映射实现数据转换
.eg
Meat_to_animal = {‘bacon’:’pig’,’pulled pork’:’pig’,’pastrami’:’cow’,’honey ham’:’pig’,’nova lox’:’salmon’}
由于涉及到大小写,所以此处统一转换为小写
Data[‘animal’] = data[‘food’].map(str.lower).map(meat_to_animal)
Data[‘food’].map(lambda x:meat_to_animal[x.lower()]) #等价于上面
替换值
Data.replace(-999,np.nan)
Data.replace([-999,-1000],np.nan)
Data.replace([-999,-1000],[np.nan,0])
Data.replace({-999:np.nan,-1000:0})
重命名
Data.rename(index={‘OHIO’:’INDIANA’},columns = {‘three’:’peekaboo’})
离散化和面元划分
Ages = [20,22,25,27,21,23,37,31,61,45,41,32]
Bins = [18,25,35,60,100]
Cats = pd.cut(ages,bins)
group_names = [‘Youth’,’Young Adult’,’MiddleAged’,’Senior’]
pd.cut(ages,bins,labels=group_names)
检测和过滤异常值
data.loc[(data.a>2.5)|(data.a<-2.5)] = 2.5 #某列大于或者小于2.5的值赋值为2.5
字符串操作
Val = ‘ a, b, guido’
Val.split(‘,’)
Pieces = [x.strip() for x in val.split(‘,’)]
Val.index(‘,’)
Val.find(‘:’)
Val.count(‘,’)
正则表达式
import re
text = “foo bart baz tqux”
re.split(‘s+’,text)
re.split(‘s+’,text)
regex = re.compile(‘s+)
regex.findall(text) #findall返回的是字符串中所有的匹配项
#search 只返回第一个
#match
#分解邮箱帐号
text = “”” Dava dave@google.com Steve steve@gmail.com”””
pattern = r’[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}’
regex = re.compile(pttern,flags= re.IGNORECASE) #IGNORECASE 表示对大小写不敏感
使用findall得到所有符合条件的结果
regex.findall(text)
将匹配到的模式替换为指定的模式
regex.sub(‘REDACTED’,text)
想要把匹配到的内容分为3部分,只需要将待分段的模式的各部分用圆括号包起来即可
pattern= r’([A-Z0-9._%+-]+)@([A-Z0-9.-]+).([A-Z]{2,4})’
regex = re.compile(pattern,flags = re.IGNORECASE)
#对于带有分组功能的模式,findall会返回一个元组列表
regex.findall(text)
处理缺失数据
test1.dropna() #删除为空的数据
test1.dropna(how=’all’) #删除全为空的行
test1.dropna(axis=1,how=’all’) #删除全为空的列
test1.fillna(0) #只要列为空,则删除整行
test1.fillna({1:0.5,2:0})
test.fillna(df.iloc[1].mean()) #将平均值填入空值
数据转换
移除重复数据
data.drop_duplicates() #默认判断全部列
data.drop_duplicates([‘k1’]) #制定某一个列
data.drop_duplicates([‘k1],keep=’last’) #默认保存第一个出现的值组合,加入keep则保存最后一个
利用函数或者映射进行时 数据转换
data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon',
'Pastrami', 'corned beef', 'Bacon',
'pastrami', 'honey ham', 'nova lox'],
'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
meat_to_animal = {
'bacon': 'pig',
'pulled pork': 'pig',
'pastrami': 'cow',
'corned beef': 'cow',
'honey ham': 'pig',
'nova lox': 'salmon'}
lowercased = data['food'].str.lower()
data['animal'] = lowercased.map(meat_to_animal)
data['food'].map(lambda x: meat_to_animal[x.lower()]) #也可用一个函数来实现
重命名列
data = data.rename(columns={'列1':'seq','备注':'remark','名称':'name','布局':'layout','大小':'area','朝向':'direction',
'补充':'extra','是否有交通线路':'traffic','价格':'price','最后更新时间':'last_update'}, ,inplace = True)
排序
frame = DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
frame.sort_index(by='b')
frame.sort_index(by='b',ascending=False) #按照降序排序
corrDf['Survived'].sort_values(ascending = False)
删除数据后重塑索引位置
data = data.reset_index(drop = True)
实现count(distinct *)
data.groupby('国家')['小计','顾客号码'].agg({'小计':np.sum,'顾客号码':pd.Series.nunique})
解决图表的乱码问题
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
禁用分组键作为索引
data_RFM = data_RFM.groupby("顾客号码",as_index=False).agg({'发票号码':pd.Series.nunique,'年月日':np.max,'小计':np.sum})
时间格式转为字符串
![1eb24e8b9d1900d04e266bd634bd4773.png](https://i-blog.csdnimg.cn/blog_migrate/08f0670638bb7973b8c30c5b84905172.png)
将字符串类型转换为时间类型
#字符串转时间格式
#时间格式的数据相减,取间隔天数
from datetime import datetime
value = '2011-01-03'
datetime.strptime(value,'%Y-%m-%d')
获取时间间隔
value = '2011-01-03'
value = datetime.strptime(value,'%Y-%m-%d')
result = datetime.now() - value
result.days
转成月份
![113458e488dacdd579bfad046cccfbe9.png](https://i-blog.csdnimg.cn/blog_migrate/1c92dc7c76db294e0daa999c16b10709.png)
当前日期前后几天几小时