10分钟入门pandas

翻译自官网:pandas官网 pandas version:1.3

导入pandas和numpy
import pandas as pd
import numpy as np
创建对象

Series对象
通过传入一个list列表来创建Series,默认的index是从0开始的整数。

s = pd.Series([1,2,3,np.nan,7,3])
print(s)
#output
0    1.0
1    2.0
2    3.0
3    NaN
4    7.0
5    3.0
dtype: float64

DataFrame对象

dates = pd.date_range("20130101", periods=6)
print(dates)
#output
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))
#output
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988
查看数据

查看各列的数据类型

print(df.dtypes)

查看对表的数据分析

print(df.describe())
df.head() #查看前几行
df.taile(5) #查看后5行
df.index #查看行索引
df.columns #查看列标签
ndf = df.T #对df的转置

将数据表转为numpy数组格式

df.to_numpy()

注意: df.to_numpy()方法对于统一的数字类型转换是很快的,但是对于各列数据类型不同的df来说是很费劲的,不推荐这么做。

排序
  • 根据index排序 sort_index
df.sort_index(axis=1,ascending=False) #表示对列进行排序,默认为升序,这里为降序
                D         C         B         A
2013-01-01 -1.135632 -1.509059 -0.282863  0.469112
2013-01-02 -1.044236  0.119209 -0.173215  1.212112
2013-01-03  1.071804 -0.494929 -2.104569 -0.861849
2013-01-04  0.271860 -1.039575 -0.706771  0.721555
2013-01-05 -1.087401  0.276232  0.567020 -0.424972
2013-01-06  0.524988 -1.478427  0.113648 -0.673690
#可以看到这种排序的结果就是列的前后顺序变化
df.sort_index(axis=0,ascending=False)
                   A         B         C         D
2022-03-07  0.701706  0.121685  0.814932 -0.024373
2022-03-06 -1.678984 -0.022840 -1.206375  0.657458
2022-03-05 -1.380990 -0.744769  0.724624 -0.868785
2022-03-04 -0.132180 -0.993480  1.592413  0.042532
2022-03-03  2.628804  0.904721  0.570431 -0.430371
2022-03-02  0.250621 -1.186890  1.245024  0.256989
2022-03-01 -1.645258  2.799524  0.451530  0.134965
#可以看到是根据行标签进行排序了

注意:默认sort_index(axis=0,ascending=True),另外0等价于‘index’,1等价于’columns’,也就是可以写成df.sort_index(axis=‘index’)的形式。

  • 根据value排序 sort_values
df.sort_values(by='A') #根据第A列的值排序,默认是升序
df.sort_values(by=['A','B']) #根据第A,B列的值排序,先排A再排B
选择数据

官方注意:pandas中有标准的python或者numpy选择数据的表达式,直观、交互性好、容易上手,但是对于开发环境,推荐使用经过优化后的方法:.at, .iat, .loc, .iloc.

通过[ ]方式选取
#选取某列,比如A列
df['A'] #得到一个Series对象
#或者等价于
df.A

#选取几行,python的切片表达式
df[0:3]
#output
				A			B			C			D
2022-03-01	0.576333	0.130979	-0.196987	-1.072045
2022-03-02	0.026575	0.492653	0.135409	-0.063815
2022-03-03	-1.010033	-1.106872	1.198783	-1.331392

df['20220301':'20220304']
#output

				A			B			C			D
2022-03-01	0.576333	0.130979	-0.196987	-1.072045
2022-03-02	0.026575	0.492653	0.135409	-0.063815
2022-03-03	-1.010033	-1.106872	1.198783	-1.331392
2022-03-04	2.177722	0.814127	-0.800291	-0.041443

注意: 第二种通过行标签值(index)来选取的方式是包含头和尾的,而第一种通过数字下标来选取的方式是不包含尾的。

selection by label 通过标签选取 .loc
#通过index选取某行的值
temp = df.loc[dates[0]]
print(temp,type(temp)) #Series对象

A    0.576333
B    0.130979
C   -0.196987
D   -1.072045
Name: 2022-03-01 00:00:00, dtype: float64 <class 'pandas.core.series.Series'>
#选取某几列
df.loc[:,['A','B']]


				A			B
2022-03-01	0.576333	0.130979
2022-03-02	0.026575	0.492653
2022-03-03	-1.010033	-1.106872
2022-03-04	2.177722	0.814127
2022-03-05	0.019173	-0.119878
2022-03-06	1.611749	0.013235
2022-03-07	0.558080	1.061602
#根据index切片选取多行多列
df.loc['20220301':'20220304',['B','C']]


				B			C
2022-03-01	0.130979	-0.196987
2022-03-02	0.492653	0.135409
2022-03-03	-1.106872	1.198783
2022-03-04	0.814127	-0.800291
#或者只选取一行多列
df.loc['20220303',['A','B']]

A   -1.010033
B   -1.106872
Name: 2022-03-03 00:00:00, dtype: float64
#选取一个特定的值
df.loc['20220303','A']
#更快的方法
df.at[dates[0],'A']

总结: loc方法是通过标签来选取的,不论是行标签还是列标签。行标签还可以通过切片来选择,列标签则是一个列表,其形式都是 df.loc[row_label,columns_list]的形式。
另外,对于标量的选取,df.at[row_label,column_label]更加快速。

selection by position 通过位置选取 .iloc[]

不同于df.loc[]的方式在于传入的参数都是数字,通过数字下标来选择数据。

#选择某一行
df.iloc[3]

A    2.177722
B    0.814127
C   -0.800291
D   -0.041443
Name: 2022-03-04 00:00:00, dtype: float64
#选择某几行
df.iloc[1:3] #不包含3 等价于 df.iloc[1:3,:]

				A			B			C			D
2022-03-02	0.026575	0.492653	0.135409	-0.063815
2022-03-03	-1.010033	-1.106872	1.198783	-1.331392
#选择某几行,某几列
df.iloc[1:3,0:2]

				A			B
2022-03-02	0.026575	0.492653
2022-03-03	-1.010033	-1.106872
#选择某几行,所有列
df.iloc[1:3,:]

				A			B			C			D
2022-03-02	0.026575	0.492653	0.135409	-0.063815
2022-03-03	-1.010033	-1.106872	1.198783	-1.331392
#选择某几列,所有行
df.iloc[:,0:2]

				A			B
2022-03-01	0.576333	0.130979
2022-03-02	0.026575	0.492653
2022-03-03	-1.010033	-1.106872
2022-03-04	2.177722	0.814127
2022-03-05	0.019173	-0.119878
2022-03-06	1.611749	0.013235
2022-03-07	0.558080	1.061602
#离散选择某几行
df.iloc[[1,2,4]]

				A			B			C			D
2022-03-02	0.026575	0.492653	0.135409	-0.063815
2022-03-03	-1.010033	-1.106872	1.198783	-1.331392
2022-03-05	0.019173	-0.119878	1.499951	-0.845860
#离散选择某几行,某几列
df.iloc[[1,2,4],[0,2]]

				A			C
2022-03-02	0.026575	0.135409
2022-03-03	-1.010033	1.198783
2022-03-05	0.019173	1.499951
#选择一个标量
df.iloc[0,2]
-0.19698718556627817
#更快的方法
df.iat[0,2]
-0.19698718556627817

总结: 注意到不管是通过标签选取还是通过位置下标选取一个标量,都对应提供了at方法(df.at[row_index,column_label], df.iat[row_number,column_number])

布尔条件选取
#选择A列数据大于0的行
df[df['A']>0]

				A			B			C			D
2022-03-01	0.576333	0.130979	-0.196987	-1.072045
2022-03-02	0.026575	0.492653	0.135409	-0.063815
2022-03-04	2.177722	0.814127	-0.800291	-0.041443
2022-03-05	0.019173	-0.119878	1.499951	-0.845860
2022-03-06	1.611749	0.013235	0.722563	-0.682336
2022-03-07	0.558080	1.061602	-0.228625	0.584362
#选出所有数据中大于0的,空出来的位置用nan填充
df[df>0]

				A			B			C			D
2022-03-01	0.576333	0.130979		NaN			NaN
2022-03-02	0.026575	0.492653		0.135409	NaN
2022-03-03	NaN			NaN				1.198783	NaN
2022-03-04	2.177722	0.814127		NaN			NaN
2022-03-05	0.019173	NaN				1.499951	NaN
2022-03-06	1.611749	0.013235		0.722563	NaN
2022-03-07	0.558080	1.061602		NaN			0.584362
#使用isin()判断是否包含
#新增一列离散数据
df['E'] = ['one','two','three','four','five','six','seven']
print(df)

                   A         B         C         D      E
2022-03-01  0.576333  0.130979 -0.196987 -1.072045    one
2022-03-02  0.026575  0.492653  0.135409 -0.063815    two
2022-03-03 -1.010033 -1.106872  1.198783 -1.331392  three
2022-03-04  2.177722  0.814127 -0.800291 -0.041443   four
2022-03-05  0.019173 -0.119878  1.499951 -0.845860   five
2022-03-06  1.611749  0.013235  0.722563 -0.682336    six
2022-03-07  0.558080  1.061602 -0.228625  0.584362  seven

isin()判断是否包含

df[df['E'].isin(['one','three'])]

				A			B			C			D		E
2022-03-01	0.576333	0.130979	-0.196987	-1.072045	one
2022-03-03	-1.010033	-1.106872	1.198783	-1.331392	three
setting 设置

新增一列

s1 = pd.Series([1, 2, 3, 4, 5, 6,7], index=pd.date_range("20220301", periods=7))
df['F'] = s1

修改值

df.at[dates[0],'A'] = 0
df.iat[0,1] = 0
df.loc[:,'D'] = np.array([5]*len(df)) #将D列修改

df2= df.copy() #复制df
df2[df2>0] = -df2 #将所有大于0的值都取反
missing data数据缺失

Reindexing allows you to change/add/delete the index on a specified axis. This returns a copy of the data.
重新设置index能够改变、增加或者删除原来的index,返回结果是原数据的复制。

df.reindex

df2 = df.reindex(index=dates[0:4],columns=list(df.columns)+["E"])
print(df2)

                   A         B         C         D   E
2022-03-01  0.576333  0.130979 -0.196987 -1.072045 NaN
2022-03-02  0.026575  0.492653  0.135409 -0.063815 NaN
2022-03-03 -1.010033 -1.106872  1.198783 -1.331392 NaN
2022-03-04  2.177722  0.814127 -0.800291 -0.041443 NaN

设置缺失值

df2.loc[dates[0]:dates[1],'E'] = 1
df2.iloc[1,1] = np.nan
print(df2)

                   A         B         C         D    E
2022-03-01  0.576333  0.130979 -0.196987 -1.072045  1.0
2022-03-02  0.026575       NaN  0.135409 -0.063815  1.0
2022-03-03 -1.010033 -1.106872  1.198783 -1.331392  NaN
2022-03-04  2.177722  0.814127 -0.800291 -0.041443  NaN

df.dropna()删除带有缺失值的行

ndf = df2.dropna(how='any')
print(ndf)
                   A         B         C         D    E
2022-03-01  0.576333  0.130979 -0.196987 -1.072045  1.0

缺失值填充df.fillna()

df2.fillna(value=0)
print(df2)
                   A         B         C         D    E
2022-03-01  0.576333  0.130979 -0.196987 -1.072045  1.0
2022-03-02  0.026575       NaN  0.135409 -0.063815  1.0
2022-03-03 -1.010033 -1.106872  1.198783 -1.331392  NaN
2022-03-04  2.177722  0.814127 -0.800291 -0.041443  NaN

是否是缺失值一览表pd.isna(df)

pd.isna(df2)

A	B	C	D	E
2022-03-01	False	False	False	False	False
2022-03-02	False	True	False	False	False
2022-03-03	False	False	False	False	True
2022-03-04	False	False	False	False	True
统计操作

统计操作一般都会忽略缺失值

求均值

df.mean() #默认是对每一列数据求均值
A    0.565657
B    0.183692
C    0.332972
D   -0.493218
dtype: float64

df.mean(1) #对每一行数据求均值,也可以写成df.mean(axis='columns')
2022-03-01   -0.140430
2022-03-02    0.147705
2022-03-03   -0.562379
2022-03-04    0.537529
2022-03-05    0.138347
2022-03-06    0.416303
2022-03-07    0.493855
Freq: D, dtype: float64

apply

df.apply(np.cumsum) #按行累加,返回的还是df

df.apply(lambda x:x.max()-x.min()) #默认x表示行,对行操作
A    3.187755
B    2.168475
C    2.300242
D    1.915754
dtype: float64
#也可以对列操作
df.apply(lambda x: x.max()-x.min(),axis='columns')
2022-03-01    1.648378
2022-03-02    0.556468
2022-03-03    2.530175
2022-03-04    2.978013
2022-03-05    2.345811
2022-03-06    2.294084
2022-03-07    1.290228
Freq: D, dtype: float64
merge 融合
concat
df = pd.DataFrame(np.random.randn(10,4))
#break
pieces = [df[:3],df[3:7],df[7:]]
#concat
df = pd.concat(pieces)

官方注意: 向一个df添加一列是方便的,但是添加一行需要copy,代价是昂贵的,所以建议传入一个提前构建好的数据(例如Series)给df也不要迭代地一行一行添加数据。

……后面的自己看官网吧,详细的也得看官网教程。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值