目录
1 生成Series、DataFrame对象、转置、查看统计、类别
1. 读取.csv、.txt、.xlsx文件(需要安装openpyxl库)
pandas常用操作
1 生成Series、DataFrame对象、转置、查看统计、类别
s = pd.Series([1, 3, 5, np.nan, 6, 8])
- index代表行(索引)的名称,columns代表列的名称
df = pd.DataFrame(np.random.randn(6, 4), index=None, columns=list('ABCD'))
-
快速查看统计:
#统计,均值,标准差,最值
df.describe()
- 转置
df.T
- 查看类别
df.dtypes
- 显示索引和列名
df.index
df.columns
2 利用ndarray、Series创建DataFrame
-
df = pd.DataFrame(pd.Series(['A', 'B', 'C']))
-
df = pd.DataFrame({'A': 1, 'B': pd.Series([1, 3, 5, np.nan, 6], dtype=np.float32), 'C': np.array([2, 3, 4, 5, 6], dtype=np.float32), 'D': pd.Categorical(['test', 'train', 'test', 'train', 'test']), 'E': 'fool', 'F': 'nice' })
3 取首部head()和尾部tail()
df.head() #输出数据的前五行
df.head(3) #输出数据的前三行
df.tail(3) #输出数据的后三行
df.tail() #输出数据的后五行
4 新增行或列
#添加一行或多行数据
df2=df.append(df1_new, ignore_index=True) #ignore_index=True,表示不按原来的索引,从0开始自动递#增
#添加一列
df['F'] = np.array([1,2, 3]) #在df末尾新增一列,列名为F
#添加多列,可以用concat()增加,但是只能加在末尾,而reindex可以添加在任何位置
#重新索引,加入原数据只要a,b两列,下面代码是加入c, d两列, 这两列的值都是10。输出顺序可以随意更改,
df = df.reindex(columns=['a', 'c', 'b', 'd'], fill_value = 10)
5 修改行名(索引)和列名
行名和列名如果都没赋值,默认都是0开始计数
-
注意:创建一个DataFrame,不指定行名和列名,默认都是0计数
df = pd.DataFrame(np.random.randint(12, size=(3, 4)))
- 修改方式如下:
#方式一:全部修改
#修改行名
df.index = ['A', 'B', 'C']
#修改列名
df.columns = ['a', 'b', 'c', 'd']
#方式二:选择性修改某一行名或列名
#修改部分行名,0,1行名被修改成x, y
df_new =df.rename(index={0: "x", 1: "y", 2: "z"})#replace参数默认False,返回一个新的DataFrame
#修改部分列名, 修改a、b两列为c、d
df.rename(columns={"a":"c", "b":"d"}, replace=True)#replace是True,则在原表上修改
6、删除某一列或某一列
#下面两个方式等价
df.drop(columns=['B', 'C'])
df.drop(['B', 'C'], axis=1)
#删除某行,下面两个等价
df.drop([0, 1])
df.drop(index=[0, 1])
7 DataFrame、Series和numpy相互转换
#pandas转numpy, 下面四种转换等价,输出不带行名和列名。这里的df可以是Series或DataFrame
df.to_numpy(np.int64) #可以修改数据类型
df.values
np.array(df)
#numpy数组转DataFrame
df = pd.DataFrame(data)
#numpy转Series
df = pd.Series(np.array([1,2,3])) #必须是一维的ndarray,不能是多维
8 排序
-
原数据, 下面几个例子也是这个数据
1、按索引排序后(按轴)
df.sort_index(axis=0, ascending=False) #按行名的大小排序
2、按某一列值排序(按值排序)
df.sort_values(by='c') #按列名为‘c’的值排序
9 数据选择
1、选择某一列
df['a'] #输出行名为a的全部列值
2、切片(只能按行切)
下面两个效果一样
df[0:2] #输出前两行
df['A': 'B'] #按行名输出前两行
3、按行名(索引)或列名选择
df.loc['A'] #输出一行
df.loc['A', 'a'] #输出行名为A的a列,标量
df.at['A', 'a'] #跟上一个等价
df.loc['A', ['a', 'b']] #只输出行名为A, 的a, b两列的值
df.loc[:, ['a', 'b', 'c']] #输出全部行的a, b, c三列的值
df.loc['A': 'B', ['a', 'd']] #输出A到B行的a和d列
4、按位置选择
df.iloc[2] #输出第三行,位置从0行算起
df.iloc[:,2] #输出第三列, 位置从0列算起
df.iloc[0:2, 1:3] #类似numpy切片,输出(0、1)行(1、2)列
df.iloc[1, 1] #输出第2行第2列的值
df.iat[1,1] #快速访问标量,输出第2行第2列的值,与上一个等价
5、布尔索引
1、用列条件选择数据
df[df['a'] >= 10] #输出满足a列值》=10的行数据
2、用全局条件选择数据,
不满足的变为nan
df[df>2] #不大于2的值被变为nan
3. 用isin()筛选
df[df['d'].isin([4, 11])] #输出d列的值在[4, 11]内的行
10 赋值
1、按位置赋值
df.iloc[1, 1] =1000
2、用where条件赋值
df[df>0] = -df #df中大于0的值全部变为负值
11 Series、DataFrame对象追加和拼接
#追加行数据,可以是Series或DataFrame
df.append(pd.Series(np.array([1,2,3,4])), ignore_index=True) #拓展一行Series
df.append(df1, ignore_index=True) #拓展一个df1,直接将接在df后面,算做df的行
#拼接
pd.concat([df1,df2, df3], axis=1)#axis默认是0, 在0轴上合并。
12 文件输入/输出
1. 读取.csv、.txt、.xlsx文件(需要安装openpyxl库)
pd.read_csv(filepath_or_buffer, sep=',',header=0,
names=None,dtype=None, nrows=None,encoding=None等等)
filepath_or_buffer:文件所在处的路径
sep:指定分隔符,默认为逗号','
header: 指定第几行作为列名,如果没有指定列名,默认header=0; 如果数据本身不存在列名,就用header=None
names:指定列的名称,用列表表示。一般我们没有表头,即header=None时,这个用来添加列名就很有用啦!
dtype: 指定数据类型 例如{‘a’: np.float64, ‘b’: np.int32}
nrows : int, 需要读取的行数(从文件头开始算起)
encoding: 乱码的时候用这个
例子如下:
'''
读取test.csv, 以逗号识别,不存在列名,加列名0到64,将列名2的数据转成float32,
输出五行,编码为utf-8
'''
pd.read_csv('./data/test.csv', sep=',',
header=None, names=range(65),dtype={2: np.float32}, nrows=5,encoding='utf-8')
1.1 文件没有列名:
即第一就是数据,读取方式如下,这样读取后的列名就是系统默认的0,1,2...
#自动加上列名,0开始计数
df = pd.read_csv('test.csv', header=None)
#添加列名
df.columns = ['A', 'B','C'] #实际就是列名修改,但是需要提供全部列名
#读取时就添加列名
df = pd.read_csv('./data/test.csv', header=None, names=['A', 'B','C'])
1.2文件有列名:
import pandas as pd
#使用数据的列名
df = pd.read_csv('./data/test.csv')
# 等价
df = pd.read_csv('./data/test.csv', header=0)
#读取时,修改成自己的列名
df_example = pd.read_csv('Pandas_example_read.csv', names=['A', 'B','C'])
pd.read_csv('./data/foo.csv')
pd.read_csv('./data/foo.txt')
pd.read_csv('./data/foo.xlsx')
2. 写入csv、txt、xlsx文件
格式:
pd.to_csv(path_or_buf=None, sep=',' , na_rep='',
float_format=None, columns=None, header=True, index=True, 等等.....)
参数非常多,常用的几个参数如下:
filepath_or_buffer: 即文件保存路径
sep: 指定分隔符,默认为逗号',' 例:sep = '?'
na_rep:字符串,将NaN转换为特定值 例:na_rep = 'abc'
float_format: 数据格式,格式是None, 例:float_format='%.2f'
columns:保存哪些列,默认是所有类都保存, 例:columns = ['a', 'b'],只保存a, b列
header='True': 是否写入列名,默认是True
index:是否写入行名(索引),默认是True
例子如下:
df.to_csv('./fool.csv')
df.to_excel('./fool.xlsx')
'''
pandas写入test.csv中,用问号进行分割,nan值被替换成123,
写入格式是小数点后两位数,只写入c, a, b三列, 不写入列名,不写入行名(索引)
'''
df.to_csv(path_or_buf='./data/test.csv',
sep='?', na_rep='123', float_format='%.2f',
columns=['c', 'a', 'b'], header=True, index=False)
3. 读取和写入HDF5(需要装table库 )
pip install --user tables #如果是pip命令用这个
conda install pytables #如果是conda命令用这个
#读取hdf5
df = pd.read_hdf('fool.h5')
#写入hdf5
df.to_hdf('fool', 'df')
下篇博客:机器学习数据处理