pandas:数据结构DataFrame

博客介绍了DataFrame常用的属性和方法,包括创建对象、数据查看、转换与处理、索引和切片等。还提及了Python内置标准时间模块和pandas中的时间模块,指出pandas内置方法众多,可参考官方文档,仅列举了数据分析常用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍一些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内置标准时间模块:datatimedateutil
# 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中的时间模块:Timestampto_datetimedate_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
这里仅列举了一些数据分析常用的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值