pandas使用
一、pd.cut()与pd.qcut()的区别
假设有一组人员数据,而你希望将它们划分为不同的年龄组
ages = [18,20,22,25,27,21,23,37,31,61,45,32] bins = [18,25,35,60,100] cats = pd.cut(ages, bins)#将ages中的每个元素划分到bins组内 cats ''' [NaN, (18, 25], (18, 25], (18, 25], (25, 35], ..., (35, 60], (25, 35], (60, 100], (35, 60], (25, 35]] Length: 12 Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]] 四个分组采取左开右闭方式,不存在于某区间内,则为NaN ''' #添加分组标签 group_names = ['Youth', 'YoungAdult', 'MiddleAged', 'Senior'] cats = pd.cut(ages, bins, labels=group_names) ''' [NaN, Youth, Youth, Youth, YoungAdult, ..., MiddleAged, YoungAdult, Senior, MiddleAged, YoungAdult] Length: 12 Categories (4, object): [Youth < YoungAdult < MiddleAged < Senior] ''' ''' qcut是类似cut的函数,但是qcut是使用的样本分位数,所以得到大小基本相等的面元。即每个面元,每个分组的数据数量基本相同。 pd.qcut(data,4) 即将数据data均匀撒在四个分组中 ''' data = [x for x in range(20)] pd.qcut(data, 4,labels=[0,1,2,3]) ''' [0, 0, 0, 0, 0, ..., 3, 3, 3, 3, 3] Length: 20 Categories (4, int64): [0 < 1 < 2 < 3] '''
二、当数据列中存在NA值时,想对这些NA值进行填充
import pandas as pd import numpy as np train_file = "train.csv" test_file = "test.csv" test_result_file = "gender_submission.csv" train = pd.read_csv(train_file) test = pd.read_csv(test_file) test_y = pd.read_csv(test_result_file)#test也有标签,用于核对模型对test数据预测的结果好坏 full_data = [train,test] print(train.info()) #比如有一数据列Age,存在NA值,使用的填充值的范围[(mean - std) ,(mean + std)] for dataset in full_data: age_avg = dataset['Age'].mean() age_std = dataset['Age'].std() age_null_count = dataset['Age'].isnull().sum() age_default_list = np.random.randint(low=age_avg-age_std,high=age_avg+age_std,size=age_null_count,) dataset['Age'][np.isnan(dataset['Age'])] = age_default_list dataset['Age'] = dataset['Age'].astype(int)
三、如何更改pandas DataFram的列名
有两种方法:df.columns和df.renames
import pandas as pd df = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]}) print(df) ''' a b 0 1 4 1 2 5 2 3 6 ''' #一、修改列名a,b为A、B df.columns = ['A','B'] print(df) ''' A B 0 1 4 1 2 5 2 3 6 ''' #二、只修改列名A为a df.rename(columns={'A':'a'}) ''' a B 0 1 4 1 2 5 2 3 6 '''
四、pandas中pd.loc和pd.iloc及pd.ix的区别
import pandas as pd data = [[1,2,3],[4,5,6]] index = ['A','B'] columns=['a','b','c'] df = pd.DataFrame(data=data, index=index, columns=columns) ''' a b c A 1 2 3 B 4 5 6 ''' #loc——通过行标签索引行数据 df.loc['A'] ''' a 1 b 2 c 3 Name: A, dtype: int64 ''' df.loc['B'] ''' a 4 b 5 c 6 Name: B, dtype: int64 ''' #iloc——通过行号获取行数据 df.iloc[0] ''' a 1 b 2 c 3 Name: A, dtype: int64 ''' df.iloc[1] ''' a 4 b 5 c 6 Name: B, dtype: int64 ''' #ix——结合前两种的混合索引 df.ix['A'] ''' a 1 b 2 c 3 Name: A, dtype: int64 ''' df.ix[0] ''' a 1 b 2 c 3 Name: A, dtype: int64 '''
五、pandas如何去掉数据集某列或者某行
pd.drop(),要注意如果想直接作用到原对象上,可传入参数inplace=True,即:pd.drop(inplace=True)
df = pd.DataFrame(np.arange(12).reshape(3,4), columns=['A','B','C','D']) df ''' A B C D 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 ''' df.drop(['B','C'],axis=1) ''' A D 0 0 3 1 4 7 2 8 11 ''' #去掉某行 df.drop([0,1]) ''' A B C D 2 8 9 10 11 ''' #传入参数inplace=True,直接作用于原对象 df.drop([1,2],inplace=True) df ''' A B C D 0 0 1 2 3 '''
六、pd.Series()使用
Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签(即索引)组成
Se = pd.Series([4, 7, -5, 3]) Se ''' 0 4 1 7 2 -5 3 3 dtype: int64 ''' Se = pd.Series([4,7, -5, 3], index=['d', 'b', 'a', 'c']) Se ''' d 4 b 7 a -5 c 3 dtype: int64 ''' #取值 Se['a'] ''' -5 ''' Se['b'] ''' 7 ''' #元素为int时计算 Se * 2 ''' d 8 b 14 a -10 c 6 dtype: int64 '''
七、pd合并数据集
pd.concat()用法
s1 = pd.DataFrame([0,1], index=['a', 'b']) s2 = pd.DataFrame([2,3], index=['c', 'd']) s3 = pd.DataFrame([4,5], index=['e', 'f']) ''' s1 0 a 0 b 1 s2 0 c 2 d 3 s3 0 e 4 f 5 ''' #默认按照行合并 pd.concat( [s1,s2,s3] ) ''' 0 a 0 b 1 c 2 d 3 e 4 f 5 ''' #axis=1,按照列合并,如果索引不同,用NAN填充 pd.concat([s1,s2,s3],axis=1) ''' 0 0 0 a 0.0 NaN NaN b 1.0 NaN NaN c NaN 2.0 NaN d NaN 3.0 NaN e NaN NaN 4.0 f NaN NaN 5.0 ''' #axis=1,按照列合并,如果索引相同,s1和s2,s3索引都是a,b pd.concat([s1,s2,s3],axis=1) ''' 0 0 0 a 0 2 4 b 1 3 5 '''
八、利用pd进行数据筛选
#筛选出多列 train[ ['FamilySize','IsAlone'] ] #按照列的条件进行筛选 train['IsAlone'][train['FamilySize']==1] = 1#将FamilySize域为1的IsAlone域赋值为1
九、关于low_memory=False
import pandas as pd data = pd.read_csv('银行产品推荐数据.csv') ''' Warning (from warnings module): File "Bank.py", line 1 import pandas as pd DtypeWarning: Columns (11) have mixed types. Specify dtype option on import or set low_memory=False. ''' #有时出现上面的错误,改正方法 #方法一 data = pd.read_csv('银行产品推荐数据.csv', low_memory=False) #方法二,优于方法一 data = pd.read_csv( '银行产品推荐数据.csv', dtype={ "Is Employee's Spouse":str } )
pandas读取csv文件默认是按块读取的,即不一次性全部读取;
另外pandas对数据的类型是完全靠猜的,所以pandas每读取一块数据就对csv字段的数据类型进行猜一次,所以有可能pandas在读取不同块时对同一字段的数据类型猜测结果不一致
low_memory=False 参数设置后,pandas会一次性读取csv中的所有数据,然后对字段的数据类型进行唯一的一次猜测。这样就不会导致同一字段的Mixed types问题了。
但是这种方式真的非常不好,一旦csv文件过大,就会内存溢出;所以推荐用方法二
十、value_counts转换为字典:to_dict()
dataframe[field].astype(int).value_counts().to_dict()
十一、筛选满足条件的行
df[df['column name'].map(len) < 2] # df为整个数据框
十二、读取excel数据,保存为txt
import pandas as pd df = pd.read_excel('test.xlsx') df.to_csv('test.txt', sep='\t', header=True, index=None)