pandas操作

目录

​pandas常用操作

1 生成Series、DataFrame对象、转置、查看统计、类别

2  利用ndarray、Series创建DataFrame

3   取首部head()和尾部tail()

4   新增行或列

5   修改行名(索引)和列名 

 7  DataFrame、Series和numpy相互转换

8  排序

  1、按索引排序后(按轴)

  2、按某一列值排序(按值排序)

9  数据选择

    1、选择某一列

    2、切片(只能按行切)

    3、按行名(索引)或列名选择

    4、按位置选择

    5、布尔索引

        1、用列条件选择数据

        2、用全局条件选择数据,

        3. 用isin()筛选

10   赋值 

1、按位置赋值

2、用where条件赋值

11  Series、DataFrame对象追加和拼接

12  文件输入/输出

1. 读取.csv、.txt、.xlsx文件(需要安装openpyxl库)

     1.1 文件没有列名:

     1.2文件有列名:

2. 写入csv、txt、xlsx文件

3. 读取和写入HDF5(需要装table库 )


​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')

       

下篇博客:机器学习数据处理

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圣诞节不感冒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值