用到的学习资料
https://www.jianshu.com/p/f7db07e0c769
https://www.jianshu.com/p/d630c14d3ea0
sklearn,交叉验证https://www.jianshu.com/p/731610dca805
用pandas读取csv文件
import pandas as pd
import numpy as np
df=pd.read_csv(r'C:\Users\pc\Desktop\cancer_null.csv',header=None,sep=',')#seq是分隔符
print (df.head())#默认打印前五行
print (df.tail())#默认打印后五行
#重命名各个标题
df=pd.read_csv('filename',header=None,sep='',names["week",'month','date','time','year','name1','freq1','name2','freq2','name3','data1','name4','data2'])
print(df)
错误: df=pd.read_csv('C:\Users\pc\Desktop\cancer_null.csv',header=None,sep=',')
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
注意windows输入路径要注意防转义 r' 路径 ',或将\改成/或者\\
#通过等⻓长字典创建
DataFrame data={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
frame=DataFrame(data)
DataFrame(data,columns=['c','b','a'])#指定顺序
frame2=DataFrame(data,index=['a','b','c'])
frame['a']
返回指定的列,行名是1
frame.loc['1']
#返回指定的⾏,第一行
frame.iloc[1]
data=DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
返回列数:
df.shape[1]
返回行数:
df.shape[0]
第二题解决方法(把列名为2的列中值为‘M’的改成1,为‘B’的改成0)
老师的方法是replacehttp://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html
df.loc[df[2]=='M',2]=1
df.loc[df[2]=='B',2]=0
df.loc[df[2]=='M',2]=1
df.loc[df[2]=='B',2]=0
#方法来源
In [16]: df.loc[(df['BBB'] > 25) | (df['CCC'] >= 75), 'AAA'] = 0.1; df
Out[16]:
AAA BBB CCC
0 0.1 10 100
1 5.0 20 50
2 0.1 30 -30
3 0.1 40 -50
作者:default
链接:https://www.jianshu.com/p/f7db07e0c769
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
基本的统计分析函数:适用于Series和DataFrame类型数据
方法 | 说明 |
.sum() | 计算数据的总和,按0轴计算,下同 |
.count() | 非NaN值的数量 |
.mean() .median() | 计算数据的算术平均值、算术中位数 |
.var() .std() | 计算数据的方差、标准差 |
.min() .max() | 计算数据的最小值、最大值 |
.describe() | 针对0轴(各列)的统计汇总 |
问题:means()和var()没有MB转换成01的那一列数据,median()有
调用方法上:df.sum()、df.sum(axis=1)分别是按列和行求和
画直方图
划重点:df[key].hist()
批量保存到本地:df[i].hist(color='g',alpha=0.5,bins=620).get_figure().savefig(r'C:\Users\pc\Desktop\pic\{}.jpg'.format(i))
getfigure().savefig()是用于保存的,不写直接显示
遇到的问题,保存的都是第一张图
#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.rand(100,4),columns=list('abcd'))
d=df['a'].hist().get_figure()
d.savefig('2.jpg')
数据清洗
删除非NAN少于33的行:df.dropna(thresh=33)
数据填充
df_full=df_full.fillna(method='ffill',limit=3)
bfill是用后面的数据填充,limit是向前最多搜寻3次
删除不完整的行
假设我们想删除任何有缺失值得行。这种操作太据侵略性,但是我们可以根据我们的需要进行扩展。
删除任何包含 NA 值的行是很容的:
data.dropna()
查看df有多少个nan
in: df.shape[0]-df.count()
Out[27]:
时间 0
小区名 0
小区房屋出租数量 1001
楼层 0
总楼层 0
房屋面积 0
房屋朝向 0
居住状态 176401
卧室数量 0
厅的数量 0
卫的数量 0
出租方式 172309
区 31
位置 31
地铁线路 104761
地铁站点 104761
距离 104761
装修情况 178047
月租金 0
dtype: int64
当然,我们也可以删除一整行的值都为 NA:
data.dropna(how='all')
我们也可以增加一些限制,在一行中有多少非空值的数据是可以保留下来的(在下面的例子中,行数据中至少要有 5 个非空值)
data.drop(thresh=5)
比如说,我们不想要不知道电影上映时间的数据:
data.dropna(subset=['title_year'])
上面的 subset 参数允许我们选择想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
删除不完整的列
我们可以上面的操作应用到列上。我们仅仅需要在代码上使用 axis=1 参数。这个意思就是操作列而不是行。(我们已经在行的例子中使用了 axis=0,因为如果我们不传参数 axis,默认是axis=0。)
删除一正列为 NA 的列:
data.drop(axis=1, how='all')
删除任何包含空值的列:
data.drop(axis=1. how='any')
这里也可以使用像上面一样的 threshold 和 subset,更多的详情和案例,请参考pandas.DataFrame.dropna。
pandas.ffill()是用同一列的上一条记录填充下一条
获取单个元素df[列][行]
df_full.shape获得的是行列
df_full.shape[0]行
df_full.shape[1]列
遍历dataframe
for row in range(1,df_full.shape[0]):
for col in range(1,df_full.shape[1]):
print(df_full[col][row])
8.1更新
lambda表达式,非常好用
df.apply(lambda x:(x-x.mean())/x.var())就可以完成数据标准化,x应该是一个临时变量
昨天的问题解决了,原因在于读取文件时,index_col和header没有致成0,置零是说以第0行,0列为索引,统计时就不对索引进行操作,只对数据本身
以后有行列索引就这样读数据
df=pd.read_csv(r'C:\Users\pc\Downloads\2ed assignment\cancer_null.csv',header=0,sep=',',index_col=0)
发现只有619*32
之前的那个Nan是上面那个图的空格,外面一圈是索引
df_full[2].values问题是通过这个命令找到的,取出第3 列所有值,发现第一个是‘1’object,然后发现这个其实是索引
去掉首行列后,如何看行列的索引?
df.columns,特征的索引
df.index样本的索引(真正的索引,上面那个不叫索引,叫列名)