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)

  

posted @ 2018-06-21 14:48  1直在路上1  阅读(331)  评论(0编辑  收藏  举报