文章目录
1. 读取数据
import pandas as pd
#pandas read_csv方法读取数据,返回值类型为DataFrame,不需要再次转换
#方法一:
f=open("F:/公司竞赛/数据/term_dict_new.csv",encoding =
"utf-8") #指定文件的绝对路径
data=pd.read_csv(f,quotechar="'") #读取文件,quotechar指定删除的引号的类型
#方法二:
data=pd.read_csv("F:/公司竞赛/数据/term_dict_new.csv",encoding =
"utf-8",quotechar="'")
2. 统计缺失值的数量
#统计字段age缺失值个数
print(data.age.isnull().sum())
#统计数据集所有列的缺失值个数
print(data.isnull().sum())
3. 空值(缺失值)
'''判断是否有缺失值'''
#判断缺失值数量
price=data['RPICE'].isnull().sum()
# 检查数据中是否有缺失值
np.isnan(train).any()
#输出结果Flase:表示对应特征的特征值中无缺失值;True:表示有缺失值通常情况下删除行,使用参数axis = 0,删除列的参数axis = 1,通常不会这么做,那样会删除一个变量。
print(df.dropna(axis= 0))
data.isnull().sum() #isnull()判断数据集每一列是否有缺失值,sum()是统计每一列缺失值的个数
'''缺失值处理'''
#删除有缺失值的样本dropna(axis=1) #default 0指行,1为列
drop_na_columns =data.dropna(axis=1) #删除data有缺失值的列
data_new = data.dropna(axis =0,subset=['IFSP_TSPACE','IFSP_TNAVIG']) #若IFSP_TSPACE列、IFSP_TNAVIG列有缺失值,删除样本
'''选择空值列 '''
#字符型空值:!= "",连续型空值:notnull()
df[df[col].notnull() & (df[col] != "")]
'''选择任意一个属性出现空值的数据 '''
test[test.T.isnull().any()]
'''剔除有空值的列,选择所有属性都有值的数据'''
#文件名为test #
test[~test.T.isnull().any()]
test[~test.T.isnull().all()]
#均值填充空值,fillna()缺失值填充函数
data["age"] =data["age"].fillna(data["age"].mean ())
4. 数据基本查询操作
'''查看数据'''
#打印数据,显示前100行和后100行
print(data)
#默认展示前5行
data.head()
'''查看数据行与列数量'''
#当前数据有行列数
print(data.shape)
'''查看列名'''
data.columns
'''数据类型'''
#输出整个模块数据是数据框、列表、字典、数组或者其他
print(type(data))
#每个指标的数据类型
print(data.dtypes)
#不受python输出行数、列数限制,输出所有指标的数据类型
data.info()
5. 限制界面输出的行列数
import pandas pd
#限制输出行列数
pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)
6. pandas索引与计算
提取某行或某列数据,需要用到 loc 函数,pandas 中会自带行索引,没有列索引
'''取行数据'''
print(data.loc[0]) #取第1行数据
print(data.loc[0:2]) #取第1~第2行数据
'''取列数据'''
#列数据没有默认指定索引,需指定哪个字段
print(data["col1"]) #取某列数据
#取某几列数据
column=["col1","col2"] #把要提取的几列指标名称创建为一个列表
data_new=data[column]
print(data_new)
'''索引操作'''
#指标排序后,对索引进行重新排序,reset_index()
new_data = data.sort_values('AGE',ascending=False)
#对索引进行重新排序
reindexed = new_data.reset_index(drop = True) #drop = True删除原来的索引
print(user_info_reindexed[0:10])
#定位样本位置
row_price = term_dict.loc[83,"RPICE"] #定位RPICE第83行
7. 查找指定字段
#把列名转为一个列表
col_names = term_dict.columns.tolist()
print(col_names)
#gram_col初设为空表
gram_col = []
for c in col_names:
if c.endswith("CODE"): #以CODE结尾
gram_col.append(c) #若col_names以CODE结尾,把值加到gram_col
gram_df = term_dict[gram_col] #把以CODE结尾赋值给gram_df
print(gram_df.head(3))
8. 计算
'''简单计算'''
#若存在空值会报错,故进行计算前,需进行空值处理
#加法
div_10=term_dict["RPICE"]/10
print(div_10)
#求最大值
term_dict["RPICE"].max()
'''缺失值处理然后计算'''
#求均值
mean_price = sum(data['RPICE'])/len(data['RPICE']) #当数据有缺失值时,计算结果是缺失值nan
print(mean_price)
#删除缺失值,再求均值
good_price = data['RPICE'][pd.isnull(data['PRICE'])== False] #删除缺失值,只提取不为空的数据
good_price = data[data['PRICE'].notnull()]
#求均值
correct_mean_price = sum(good_price)/len(good_price)
'''mean()函数求均值'''
#直接用mean()函数求均值,注意,mean()求均值时会直接删除缺失的值再求均值
correct_mean_price=term_dict['RPICE'].mean()
9. 排序
'''简单排序'''
#sort_values(),inplace是指在原来的数据上集排序,还是生成新的数据集。默认是从小到大进行排序
data.sort_values("col",inplace=True) #在原来的数据上集排序
#降序排列,指定ascending(是否升序)=False,数据进行降序排列,若有缺失值,不管是升序还是降序排列,缺失值都会放在最后
data.sort_values("col",inplace=True,ascending =False)
data['sort_num']=data['comment_num'].rank(ascending=0,method='dense')
'''排序并给出序号,ascending,就是选择是升序还是降序排列,参数method,这个参数很重要。'''
#(1) 第一种情况,如果出现相等,则序号一样,之后序号照常递增。这种情况就是上图的,我们看到comment_num等于4的有2个,序号为1。comment_num等于3的时候,序号为2,这个叫做正常按1依次递增。这和时候method='dense'
data['sort_num']=data['comment_num'].rank(ascending=0,method='dense')
#(2) 第二种情况,如果出现相等,则取最先出现的值序号为“最小”,其他相同值依次按1递增,如果把上面代码method='first',就是实现这种效果,效果如下图:
data['sort_num']=data['comment_num'].rank(ascending=0,method='first')
'''分组排序并给出序号'''
#comment_num 排序指标,cate分组指标
data['group_sort']=data['comment_num'].groupby(data['cate']).rank(ascending=0,method='dense')
10. pandas自定义函数
#自定义函数判断空值数量
def not_null_count(column):
column_null = pd.isnull(column)
null = column[column_null]
return len(null)
column_null_count =data.apply(not_null_count)
print(column_null_count)
a = pd.isnull(result2['NOW_DATE'])
print(len(result2['NOW_DATE'][a]))
11. 删除重复值
#方法一:
print(len(set(data['col'].tolist()))) #先把user_info['col']创建为一个列表,set创建一个集合,重复值去掉
#方法二:
#去重函数unique(),计算个数:len()
print(len(data['col'].unique()))
12 分组聚合
'''pivot_table(): 参数index指定对基于哪个指标分组,values对哪个指标进行计算,aggfunc指定要做什么计算,默认是求均值'''
#求均值
import numpy as np
price_new =data.pivot_table(index ="tmn_model",values ='RPICE',aggfunc = np.mean )
#统计个数
price_new =data.pivot_table(index ="tmn_model",values ='RPICE',aggfunc = 'count' )
#多分组计算多个指标
price_new = term_dict.pivot_table(index =["tmn_model","tmn_brand"],values =['RPICE','CPU_NUM'],aggfunc= np.mean )
'''group by 函数'''
data_new= data.groupby(by ='serv_id')['TERMInal_CODE'].count() #统计次数
group = data.groupby(by = 'MOBILE_TERMINAL_CODE') #分组
print(group.count()) #count()统计数量,默认对所有列分别统计
print(group["clumn1"].count()) #指定对列clumn1分组统计数量
print(group.count()["clumn1"]) #指定对列clumn1分组统计数量
#按照多个分组指标进行统计
group = data.groupby(by =[ 'IFSP_DW','IFSP_GAME']) #分组
print(group.count()["IFSP_OS"]) #count()统计数量
group = data.groupby(by =['IFSP_DW','IFSP_GAME']).count()
print(group) #count()统计数量
#分组求和且重新命名
data_new= data.groupby(by ='serv_id')['TERMInal_CODE'].count().reset_index()
13. 字段重新命名
data.rename(columns={'TERMInal_CODE':'CHANGE_TIMES'}, inplace = True) #TERMInal_CODE重新命名为CHANGE_TIMES
a.rename(columns={'A':'a', 'B':'b', 'C':'c'}, inplace =True)
14. 切割函数
df['Genre'].str.split(",").tolist()
15. 数据合并
'''数据合并,join按照行做引进行操作;merage按照列索引进行操作,就是平时的SQL关联'''
'''左连接'''
df1.merge(df2,on="id",how = "left") #on指定两个表之间的关联字段,how 指定连接方式,没有的已NaN补齐
'''右连接'''
df1.merge(df2,on="id",how = "right")
'''内连接'''
df1.merge(df2,on="id") #merage默认情况下是交集,how=inner
'''外连接'''
df1.merge(df2,on="id",how = "outer")
#若两张表同一字段名称不一样
df1.merge(df2,lef_on="id",right_on="nbr")
16. 离散变量标签化
'''离散变量数值化代表'''
data['CUST_GENDER_new'] = data['CUST_GENDER']
data.loc[data['CUST_GENDER_new'] =='T','CUST_GENDER_new'] = 0
data.loc[data['CUST_GENDER_new'] == 'F','CUST_GENDER_new']= 1
data.loc[data['CUST_GENDER_new'] =='x','CUST_GENDER_new'] = 2
print(data.head())
'''离散变量的编码方式 labelencoding(标签编码)'''
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder() #实例化,LabelEncoder()会在内部对类别进行重新排序, 并不是输入的顺序, 所以当输出的列是类别时, 一定要重新进行编码, 否则得到的全是打乱的顺序
le.fit(data[col])
label = le.transform(data[col])
le.classes_ # 查看重新排序后的顺序
label # 查看编码的结果
#将编码结果替换为原来列
'''
le.fit() 对数据进行编号
le.transform() 输入对应数据的编号
le.inverse_transform() 输入编号,返回数据
运行le.fit()以后,其实就成了一个双向的字典。
17. 时间加减
#字符串转为时间
import datetime
str_p = '2019-01-30 15:29:08'
dateTime_p = datetime.datetime.strptime(str_p,'%Y-%m-%d %H:%M:%S')
print(dateTime_p) # 2019-01-30 15:29:08
#两个日期加减
d1 = datetime.datetime.strptime('2012-03-05 17:41:20','%Y-%m-%d %H:%M:%S')
d2 = datetime.datetime.strptime('2012-03-02 17:41:20','%Y-%m-%d %H:%M:%S')
delta = d1 - d2
print delta.days
18. 删除行列数据
DataFrame.drop(labels=None,axis=0, index=None, columns=None,inplace=False)
'''
参数说明:
labels:就是要删除的行列的名字,用列表给定
axis:默认为0,指删除行,因此删除columns时要指定axis=1;
index:直接指定要删除的行
columns:直接指定要删除的列
inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe;
inplace=True,则会直接在原数据上进行删除操作,删除后无法返回。
'''
19. 输出指定类型的列
#只看字符类型的列
cols = data.columns
for col in cols:
if str(data[col].dtype) == 'object':
print(col)
20. 筛选数据
#断条件是这样, 我们想要更改B中的数, 而更改的位置是取决于 A 的. 对于A大于4的位置. 更改B在相应位置上的数为0.
df.B[df.A>4] == 0
21. lambda函数if条件
df['name'] = df['name'].apply(lambda x: '基金' if x is None else x)
#使用apply函数, 如果city字段包含'ing'关键词,则'判断'这一列赋值为1,否则为0
frame['panduan'] = frame.city.apply(lambda x: 1 if 'ing' in x else 0)
print(frame)
22. 设置窗口最大行列显示数
#输出窗口有省略号,数据显示不全解决方法(只在当前窗口有效)
import pandas as pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 100)
pd.set_option('display.width', 1000)
'''
'display.max_rows’是设置输出窗口显示的最多行数,超过则将多余数据用省略号表示;
'display.max_columns’是设置输出窗口显示的最多列数,超过则将多余的列用省略号表示;
'display.width’是设置输出窗口显示的最大宽度,如果一行数据的宽度多余所设置的最大宽度会将多余的列数据换行显示。
'''
23. 引用python自带数据集
#python数据集导入鸢尾花数据集
from sklearn.datasets import load_irisdata = load_iris()
#如何看某一列不同的值个数,也就是有少个不同的元素呢?
df['J'].value_counts().count() #这里values_counts()返回不同值的及包含的个数,count()将行数返回回来。
df['J'].unique().shape[0] #这里unique()返回该列包含的所有不同值,以一个矩阵的形式返回。使用shape就该矩阵的形状获取。
24. 设置不用科学计数法展示数据
#python numpy和pandas做数据分析时去掉科学记数法显示
#解决默认情况下,ndarray数组采用科学计数法显示
import numpy as np
#suppress=True 取消科学记数法,threshold=np.nan 完整输出(没有省略号)
np.set_printoptions(suppress=True, threshold=np.nan)
25. 设置小数位数
#用pd.set_option设置display.float_format参数来设置显示的小数位数
import pandas as pd
pd.set_option('display.float_format', lambda x: '%.3f' %x)
26. python定义case when 函数
def iff(x,y):
if x>30 and y>30:
z='30+'
elif x>20 and y>20:
z='20+'
else:
z=np.nan
return z
data['seg_a1']=data.apply(lambda x :iff(x['a1'],x['a2']),axis=1)