介绍一些DataFrame常用的属性和方法:
创建对象
#常通过嵌套列表、字典、numpy方法创建dataframe;index,columns参数设定行列索引。
df1 = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]], index=[4, 5, 6], columns=['A', 'B', 'C'])
df2 = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df3 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)), columns=['a', 'b', 'c', 'd', 'e'])
数据查看
df.head() #查看头部数据,默认前5行,可指定查看行数,如:df.head(2)
df.tail() #查看尾部数据,默认后5行,可指定查看行数,如:df.tail(2)
df.axes #查看行,列索引
df.index #查看行索引
df.columns #查看列索引
df.values #查看元素
df.dtypes #查看数据类型
df.shape #查看形状:(3,3)
df.size #查看形状:行*列,9
数据转换与处理
df.T #转置
df.astype('需要转换的数据类型') #数据类型转换,可指定copy参数控制是否更改原数据
df.copy() #复制,可指定deep参数:深复制/浅复制
df.isnull() #空值判断,返回布尔矩阵
df.notnull() #非空值判断,返回布尔矩阵
df.fillna() #填充空值
df.dropna() #删除空值
df.drop() #删除,axis参数指定删除行/列,inplace参数指定是否更改原数据
df.sort_values() #排序,ascending参数指定升/降序,多列排序传入列表形式
df.sort_index() #按索引排序
df.drop_duplicates() #删除重复值
df.isin() #成员资格
索引和切片
#创建一个对象
df = pd.DataFrame(np.arange(20).reshape(5,4),index = list('abcde'),columns = ['一','二','三','四'])
'''
一 二 三 四
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
e 16 17 18 19
'''
#单个值索引
df.at['a','四'] / df.iat[0, 3] / df.loc['a'].at['四'] #取第一行和第四列的交叉值
#单行索引
df.loc[['a']] / df.iloc[[0]] #取第一行的记录
#单列索引
df[['一']] / df.loc[:,['一']] / df.iloc[:,[0]] #取第一列的记录
#指定多行索引
df.loc[['a','c']] / df.iloc[[0,2]] #取第一行和第三行
#指定多列索引
df[['二','四']] / df.loc[:,['二','四']] / df.iloc[:,[1,3]] #取第二列和第四列的记录
#多行区间索引
df.loc['b':'d'] / df.iloc[1:4] #取第二行到第三行的记录
#多列区间索引
df.loc[:,'一':'三'] / df.iloc[:,0:3] #取第一列到第三列的记录
#布尔索引
df.loc[df['三']>10] #取第三列大于10的所有记录
df.loc[(df['一']>5) & (df['四']<15)] #取第一列大于5,第四列小于15的所有记录
数据运算
df.describe() #统计描述
df.mean() #平均值
df.max() #最大值
df.min() #最小值
df.count() #查看各列包含元素个数
df.std() #标准差
df.sum() #求和
df.cumsum() #累计求和
df.quantile(q=0.75) #分位数,q指定几分位数
df.median() #中位数
df.skew() #样本偏度
df.kurt() #样本峰度
合并/连接/切分
pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
'''
常用参数说明:
left、right: 输入两个DataFrame
how: 指定连接方式:inner、left、right、outer; 默认为inner
on : 指定连接的索引列名,多个索引用列表传入
left_on: 左则DataFrame中用作连接键的列名
right_on: 右则DataFrame中用作连接键的列名
left_index: 左则DataFrame中的行索引
right_index: 右则DataFrame中的行索引
sort: 将合并的数据进行排序,默认为True,设置为False可以提高性能
suffixes: 字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')
copy: 将数据复制到数据结构中,默认为True,设置为False可以提高性能
'''
DataFrame.join(other,on = None,how ='left',lsuffix ='',rsuffix ='',sort = False )
'''
常用参数说明:
other: DataFrame
on: 指定连接键
how: {'left','right','outer','inner'},默认:'left'
lsuffix: 列名重叠时使用的后缀
rsuffix: 列名重叠时使用的后缀
sort: 按连接键排序,默认为False
'''
pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False, copy=True)
'''
常用参数说明:
objs: 合并的dataframe,以列表传入
axis: 指定拼接的轴方向,0 代表横轴方向拼接,即列不变,行数增加;1 代表纵向拼接,即行不变,列增加
join: {'left','right','outer','inner'},默认:'outer'
ignore_index: 重新指定索引
copy: 是否创建新的数据
'''
#如果用索引拼接,可用 join(),根据列名拼接,可用 merge(),仅仅是横向或者纵向拼接,就用 concat()
pandas.cut(x,bins,right = True,labels = None,retbins = False,precision = 3,include_lowest = False,duplicates ='raise' )
'''
常用参数说明:
x: 需要切分的数据
bins: 分组间距,可以使整数 3,或者组边界组成的列表 [3,6,9]
right: 指定右边是否包含
labels: 指定分组的名称
retbins: 额外返回边界值
'''
pandas.qcut(x,q,labels = None,retbins = False,precision = 3,duplicates ='raise' )
'''
常用参数说明:
x: 需要切分的数据
q: 指定分位数,整数或者分位数列表
bins: 分组间距,可以使整数 3,或者组边界组成的列表 [3,6,9]
labels: 指定分组的名称
retbins: 额外返回边界值
'''
# qcut()是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的.
# cut()将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的.
分组
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
#创建一个数据
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
'''
A B C D
0 foo one 0.202245 -0.106055
1 bar one 0.102074 0.689398
2 foo two -0.215584 1.503179
3 bar three -0.176598 0.575779
4 foo two -0.730546 -0.378489
5 bar two -1.157245 0.296294
6 foo one -0.417925 0.275566
7 foo three 1.215270 -0.020956
'''
#按A列分组,对C列求均值运算
df.groupby('A')['C'].mean()
'''
A
bar -0.410590
foo 0.010692
Name: C, dtype: float64
'''
#按A,B列分组,对C列计数
df.groupby(['A','B'])['C'].count()
'''
A B C
bar one 1
three 1
two 1
foo one 2
three 1
two 2
Name: C, dtype: int64
'''
#按A列分组,对C列同时求和,计数两种运算
df.groupby('A')['C'].agg([np.sum,'count'])
'''
A sum count
bar -1.231769 3
foo 0.053460 5
'''
#按A列分组,分别对C列求和,对D列计数
df.groupby('A').agg({'C':['sum'],'D':['count']})
'''
C D
sum count
A
bar -0.640205 3
foo -2.216909 5
'''
时间模块
- python内置标准时间模块:
datatime
,dateutil
# datetime 常用的三个内置方法:data,datetime,timedelta
from datetime import date
from datetime import datetime
from datetime import timedelta
t1 = date.today()
#2019-06-21
t2 = datetime.now()
#2019-06-21 11:20:50.280319
t3 = t1 - timedelta(1)
#2019-06-20
# dateutil模块常用内置方法:parse,parse几乎可以将任何文本形式转换为datetime格式。
from dateutil.parser import parse
d1 = parse('2000-1-1')
d2 = parse('5/1/2014')
d3 = parse('5/1/2014', dayfirst = True) # 国际通用格式中,日在月之前,可以通过dayfirst来设置
d4 = parse('22/1/2014')
d5 = parse('Jan 31, 1997 10:45 PM')
'''
结果如下:
2000-01-01 00:00:00
2014-05-01 00:00:00
2014-01-05 00:00:00
2014-01-22 00:00:00
1997-01-31 22:45:00
'''
- pandas中的时间模块:
Timestamp
,to_datetime
,date_range()
,period_range()
,resample
import pandas as pd
date1 = pd.Timestamp('2019-06-20')
'''
Timestamp('2019-06-20 00:00:00')
'''
date2 = pd.to_datetime([ '2017-12-21', '2017-12-22', '2017-12-23'])
'''
DatetimeIndex(['2017-12-21', '2017-12-22', '2017-12-23'], dtype='datetime64[ns]', freq=None)
'''
date3 = pd.date_range('6/1/2019','6/10/2019')
date4 = pd.date_range(start = '1/1/2019', periods = 10)
'''
DatetimeIndex(['2019-06-01', '2019-06-02', '2019-06-03', '2019-06-04',
'2019-06-05', '2019-06-06', '2019-06-07', '2019-06-08',
'2019-06-09', '2019-06-10'],
dtype='datetime64[ns]', freq='D')
'''
date5 = pd.period_range('1/6/2019', '10/6/2019', freq='M')
'''
PeriodIndex(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05', '2019-06',
'2019-07', '2019-08', '2019-09', '2019-10'],
dtype='period[M]', freq='M')
'''
d = pd.date_range('20170101', periods = 12)
s = pd.Series(np.arange(12), index = d)
s_re = s.resample('5D').sum()
print(s_re)
'''
2017-01-01 10
2017-01-06 35
2017-01-11 21
dtype: int32
'''
pandas的内置方法很多,详情可以参考官方文档:http://pandas.pydata.org/pandas-docs/version/0.23.4/index.html#module-pandas
这里仅列举了一些数据分析常用的方法。