机器学习 Python基础2 Pandas DataFrame 常用方法实践

常见的对象类型

其实在API 文档里面有很多数据类型 Pandas API Reference

  1. Series【文章后面有说明】
  2. DataFrame【文章后面有说明】
  3. Panel
  4. Index
  5. Numeric Index
  6. CategoricalIndex
  7. IntervalIndex
  8. MultiIndex
  9. DatetimeIndex
  10. TimedeltaIndex
  11. PeriodIndex
  12. Scalars
  13. Frequencies
  14. Window
  15. GroupBy
    好像有蛮多的,这里不一一列举了,有空我再补充一下每个接口的作用数据

【pandas.core.series.Series】

Series对象 是一维的数组对象,自带了数组的索引,与 numpy中的一维array类似
这个对象的所有方法可以参考官网 pandas.Series

"""=================================
1. 创建 Series 对象
"""
In [1]: s = pd.Series([1,2,3,4],index = ['a','b','c','d']) # 通过 list 传入一维数据, index 属性指定索引

In [2]: s # 输出数组内容
Out[2]:
a    1
b    2
c    3
d    4
dtype: int64

"""=================================
2. 读取 Series 对象 的 索引和值
"""
In [3]: s.index  # 通过 index 输出索引信息
Out[3]: Index(['a', 'b', 'c', 'd'], dtype='object')

In [4]: s.values # 通过 values 输出数组内容
Out[4]: array([1, 2, 3, 4], dtype=int64)

In [5]: s*2 # 对 values 的值进行操作(索引不会改变)
Out[5]:
a    2
b    4
c    6
d    8
dtype: int64

"""=================================
3. 对 Series 对象的值进行操作
"""
In [6]: s + 1 # 对 values 的值进行操作(索引不会改变)
Out[6]:
a    2
b    3
c    4
d    5
dtype: int64

"""=================================
4. 对 Series 对象的值进行筛选
"""

In [7]: s[s > 2] # 对 values 的值筛选
Out[7]:
c    3
d    4
dtype: int64

In [8]: s[s > 12] 对 values 的值筛选, 返回值是一个空的 Series
Out[8]: Series([], dtype: int64)

【pandas.core.frame.DataFrame】

是一个表格型的数据结构,提供有序的列和不同类型的列值
这个对象的所有方法可以参考官网 pandas.DataFrame

"""=================================
1. 创建 DataFrame 的对象
"""
In [1]: df1 = pd.DataFrame({'col0':[1,2,3], 'col1':[4,5,6]})

In [2]: df1
Out[2]:
   col0  col1
0     1     4
1     2     5
2     3     6

In [3]: data = {'col0':[1,2,3], 'col1':[4,5,6]}  # 通过字典创建 DataFrame 对象,可以指定指点中的 key
   ...: df2 = pd.DataFrame(data,columns = ['col1'])

In [4]: df2
Out[4]:
   col1  col0
0     4     1
1     5     2
2     6     3

In [5]: df3 = pd.DataFrame(data,columns = ['col1','col0','col2']) # 如果指定不存在的key, 会使用 NaN 来补充

In [6]: df3
Out[6]:
   col1  col0 col2
0     4     1  NaN
1     5     2  NaN
2     6     3  NaN

"""=================================
2. 读取 DataFrame 对象的某一列
"""
In [7]: df3["col1"] 
Out[7]:
0    4
1    5
2    6
Name: col1, dtype: int64

In [8]: type(df3["col1"])
Out[8]: pandas.core.series.Series

In [9]: df3.col1
Out[9]:
0    4
1    5
2    6
Name: col1, dtype: int64

"""=================================
3. 删除 DataFrame 对象的数据
"""
In [10]: del df3['col1']

In [11]: df3
Out[11]:
   col0 col2
0     1  NaN
1     2  NaN
2     3  NaN

常用方法实践

1) 重新索引

根据index参数重新进行排序。如果传入的索引值在数据里不存在,则不会报错,而是添加缺失值的新行。不想用缺失值,可以用 fill_value 参数指定填充值。

In [1]: df1 = pd.DataFrame({'col0':[1,2,3], 'col1':[4,5,6]})

In [2]: df1
Out[2]:
   col0  col1
0     1     4
1     2     5
2     3     6

In [3]: df1.index
Out[3]: RangeIndex(start=0, stop=3, step=1)

In [4]: df2 = df1.reindex(['a','b','c'],fill_value = 0)

In [5]: df2
Out[5]:
   col0  col1
a     0     0
b     0     0
c     0     0

In [6]: df2.index
Out[6]: Index(['a', 'b', 'c'], dtype='object')

根据 Out[2] 和 Out[4] 的显示,你会发现索引已经由 RangeIndex(start=0, stop=3, step=1) 变成了 Index([‘a’, ‘b’, ‘c’], dtype=‘object’)

#fill_value 会让所有的缺失值都填充为同一个值,如果不想这样而是用相邻的元素(左或者右)的值填充,则可以用 method 参数,可选的参数值为 ffill 和 bfill,分别为用前值填充和用后值填充。

In [1]: df3 = df1.reindex(range(5),method = 'ffill')

In [2]: df3
Out[2]:
   col0  col1
0     1     4
1     2     5
2     3     6
3     3     6
4     3     6

In [4]: df3 = df1.reindex(range(5),method = 'bfill')

In [5]: df3
Out[5]:
   col0  col1
0   1.0   4.0
1   2.0   5.0
2   3.0   6.0
3   NaN   NaN
4   NaN   NaN

2) 丢弃数据

data.drop([‘idx1’,‘idx2’])#删除行
data.drop([‘col1’,‘col2’],axis = 1) #添加axis参数删除列

3) 索引、选取和过滤

[注意]利用索引的切片运算与普通的 Python 切片运算不同,其末端是包含的,既包含最后一个的项。

e.gobj[‘b’:‘d’]包含’d’,但是obj[1:3]不包含3
loc和iloc
df.loc[index,column_names]#知道column names 和index,且两者都很好输入
df.iloc[index,col_index]#column_name太长;index是时间序列不好输入 i_index
ix操作:混合使用下标和名称进行选取
data.ix[‘idx’,[‘col1’,‘col2’]]
data.ix[2] #第2行
data.ix[data.col1<5,:3] # data.col1<5的前2列

4) 算术运算和数据对齐

1)Series:将2个对象相加时,具有重叠索引的索引值会相加处理;不重叠的索引则取并集,值为 NA;
2)对齐操作会同时发生在行和列上,把2个对象相加会得到一个新的对象,其索引为原来2个对象的索引的并集;和Series 对象一样,不重叠的索引会取并集,值为 NA;如果不想这样,试试使用 add() 方法进行数据填充:
df1+df2 #会出现NaN
df1.add(df2,fill_value = 0)#无NaN

5) 函数应用和映射

df1.astype(np.int32)
df2.apply(f) #f = lambda x:x+1

6) 排序

df.sort_index(ascending = False)frame.sort_index(axis = 1)
Series: obj.sort_values()obj.sort_index()
排名
obj.rank(ascending = False) #索引位上的数的排名
带有重复值的轴索引
obj.index.is_unique#False
索引时,同时输出多个值

7) 汇总统计和计算

df.sum() #纵向汇总(行求和) aixs=1为横向汇总
df.cumsum() #纵向汇总_累计汇总
df.idxmax() #获取最大值对应的索引
obj.unique() #返回数据里的唯一值array
obj. value_counts()#统计各值出现的频率,返回Series索引为值
obj. isin([‘c’])#判断成员资格,在原表基础上修正为bool

8) 处理缺失数据

使用isnull()和notnull()函数来判断缺失情况。
对于缺失数据一般处理方法为滤掉或者填充。
滤除缺失数据
data.dropna() #返回一个包含非空数据和索引值的表,等价于data[data.notnull()]
data.dropna(how = ‘all’) #只有行里的数据全部为空时才丢弃,axis=1按列丢弃
填充缺失数据
df.fillna(0) #用默认值填充缺失数据
df.fillna({0:10,1:20,2:200})#可以传入字典对不同的列填充不同的值(键表示列)

9) 层次化索引:能在一个数组上拥有多个索引,有点像Excel里的合并单元格

根据索引选择数据子集
data[‘a’] #以外层索引的方式选择数据子集
data[:,2] #以内层索引的方式选择数据
data.unstack() #多重索引Series转换为DataFrame,第二层索引为列
重排分级顺序
df. swaplevel(‘idx1_name’, ‘idx2_name’)#将两个级别的数据进行交换
df. sortlevel(0,ascending = False)#以行按第一层(0)进行排序
df. sortlevel(1,ascending = False,axis=1)#列按第二层(1)进行排序
根据级别汇总统计
多层次索引的数据,汇总的时候可以单独按照级别进行
df.sum(level=‘idx1_name’)

10) 数据合并

a)pandas.merge():数据库风格的合并
pd.merge(df1,df2,on=‘col_coname’) #以col_coname列当作键,默认内连接(inner),即键的交集
pd.merge(df1,df2,on=‘col_coname’,how=‘left’)#左连接(left),右连接(right)和外连接并集
left.join(right) #以索引作为连接键

b)pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起
pd.concat([s1,s2,s3]) #默认concat在竖轴(axis=0)上连接,即产生新的Series。

c)实例方法combine_first()方法:合并重叠数据
s1.combine_first(s2) #等价于np.where(pd.isnull(s1),s2,s1)
这是一个矢量化的if-else操作,如果s1里某个位置上的数据为空,则用s2同位置上的元素来补,你可以理解为“打补丁”操作。

11) 数据重塑/轴向旋转

重塑指的是将数据重新排列,也叫轴向旋转。
stack: 将数据的列“旋转”为行。unstack:将数据的行“旋转”为列。
处理堆叠格式
堆叠格式也叫长格式,一般关系型数据库存储时间序列的数据会采用此种格式
df.pivot(‘col1’,‘col2’,‘col3’)

12) 数据转换:对数据的过滤、清理以及其他的转换操作。

移除重复数据
df.duplicated() #检测各行是否重复,默认判断全部列,默认保留第一个出现的值
df.duplicated([‘col1’]) #判断指定列
df.drop_duplicates() #丢弃重复行
df.drop_duplicates(keep=‘lost’) #或传入take_last=True保留最后一个值

利用映射进行数据转换
data[‘new_col’] = data[‘col1’].map(col1_to_new_col)#map到一个dict
data[‘col1’].map(lambda x: col1_to_new_col[x]) #等价于使用函数
替换值
data.replace(value,np.nan)
data.replace([value1, value2],[ np.nan,0])
重命名轴索引
data.rename(index=str.title,columns=str.upper)
将数据划分成不同的组
scores=[40,54,60,85,87,81]
score_levels=[0,60,80,95]
cats = pd.cut(scores,score_levels) #输出内容为区间的列表
pd.value_counts(cats) #统计区间个数

检测和过滤异常值
data.decsribe() #产生数据的count,mean,std,min…
data[np.abs(data)>2] #找出绝对值大于2的值,不满足的为nan
data[np.abs(data)>2.any(1)] #找出绝对值大于2的行
data[np.abs(data)>2]=0 #将异常值设置为0

猜你喜欢

转载自blog.csdn.net/q370835062/article/details/84641365