pandas --基础操作(一): Serise 、DataFrame 创建和数据选择 基础操作

it2025-09-07  8

python 数据分析

第一章 Python 数据分析之pandas的使用 第一节: pandas --基础操作(一): Serise 、DataFrame 创建和数据选择 基础操作 第二节: pandas – 基础操作(二): DataFrame 的增删改查、排序操作等基础操作 第三节: pandas – 基础操作(三):pandas 层次化索引创建、数据选择 第二章 Python 数据分析之 时间戳操作 第二章 python 数据分析之numpy的使用 第三章 python 数据可视化之matplotlib的使用


@[TOC](文章目录)

前言

在数据分析中pandas 有着举足轻重的地位,提供了高性能、易使用的数据结构与数据分析工具。


一、pandas是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

1.引入库

导入pandas和numpy两个包,导入方式如下:

import numpy as np import pandas as pd

2.对象Series、DataFrame

pandas有2个数据对象分别为Series和DataFrame,Serise为单列数据,DataFrame是为多列Serise的集合。

2.1 生成Serise

Serise是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为索引。调用 pd.Series 函数即可创建 Series。

格式: pd.Series(data,index=index)

上述代码中,data 支持以下数据类型: - Python 字典 - 多维数组 - 标量值(如,5) index 是轴标签列表,不同标签可以分为如下几种情况:

没有指定index参数

data用值列表生成 Series 时,Pandas 默认自动生成整数索引,代码如下:

In [3]: s = pd.Series([1, 3, 5, np.nan, 6, 8]) In [4]: s Out[4]: 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64 多维数组

data为多维数组,data的长度和index的长度相同

s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e']) # np.random.randn(5) # Out[34]: array([-0.87399137, -0.60509713, -1.07188732, 0.93279748, 0.23194527]) s Out[35]: a -0.784034 b 0.302415 c -0.907291 d 0.207490 e -0.652792 dtype: float64 字典 se = pd.Series({'a':1,'b':2,'c':4}) se Out[42]: a 1 b 2 c 4 dtype: int64

注意: data 为字典,且未设置 index 参数时,如果 Python 版本 >= 3.6 且 Pandas 版本 >= 0.23,Series 按字典的插入顺序排序索引。之前的版本按照,series按照字母顺序排序

标量值 se = pd.Series(5.0 ,index=[1,2,3,4,5]) se Out[44]: 1 5.0 2 5.0 3 5.0 4 5.0 5 5.0 dtype: float64

2.2 生成DataFrame

DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:

一维 ndarray、列表、字典、Series 字典二维 numpy.ndarray结构多维数组或记录多维数组SeriesDataFrame 用 Series 字典或字典生成 DataFrame 生成的index是每个series的并集,如果没有指定列,dataFrame的列就是字典键的有序列表 d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']), ...: 'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) # 无参数结果为sereis的并集 df Out[52]: one two a 1.0 1.0 b 2.0 2.0 c 3.0 3.0 d NaN 4.0 df = pd.DataFrame(d,index=['a','b','c']) # 指定index df Out[54]: one two a 1.0 1.0 b 2.0 2.0 c 3.0 3.0 df = pd.DataFrame(d,index=['a','c'],columns=['two','aa']) # 指定index columns df Out[56]: two aa a 1.0 NaN c 3.0 NaN 用列表字典生成 DataFrame,index 必须和字典长度比配,否则报错。 data = [{'a':1, 'b':2,'c':4},{'a':4,'b':55,'d':6}] df = pd.DataFrame(data) # 并集 df Out[59]: a b c d 0 1 2 4.0 NaN 1 4 55 NaN 6.0 df = pd.DataFrame(data,index=['one','two']) df Out[61]: a b c d one 1 2 4.0 NaN two 4 55 NaN 6.0 df = pd.DataFrame(data,index=['one','two'],columns=['a','b']) df Out[63]: a b one 1 2 two 4 55 用多维数组字典、列表字典生成 DataFrame d = {'one': [1., 2., 3., 4.], 'two': [4., 3., 2., 1.]} In [45]: pd.DataFrame(d) Out[45]: one two 0 1.0 4.0 1 2.0 3.0 2 3.0 2.0 3 4.0 1.0 In [46]: pd.DataFrame(d, index=['a', 'b', 'c', 'd']) Out[46]: one two a 1.0 4.0 b 2.0 3.0 c 3.0 2.0 d 4.0 1.0 用结构多维数组或记录多维数组生成 DataFrame data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')]) data Out[46]: array([(0, 0., b''), (0, 0., b'')], dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')]) data[:] = [(1, 2., 'Hello'), (2, 3., "World")] data Out[48]: array([(1, 2., b'Hello'), (2, 3., b'World')], dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')]) pd.DataFrame(data) Out[49]: A B C 0 1 2.0 b'Hello' 1 2 3.0 b'World' 用元组字典生成 DataFrame 可以自动创建多层索引 DataFrame pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}, ...: ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}, ...: ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6}, ...: ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8}, ...: ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}) Out[71]: a b b a c a b A B 1.0 4.0 5.0 8.0 10.0 C 2.0 3.0 6.0 7.0 NaN D NaN NaN NaN NaN 9.0

3. 查看数据

1. df.head(3) # 查看头部默认为5, 括号里可以添加数字表示行数 2. df.tail(3) # 查看尾部,同上 3. df.index # 查看索引 4. df.columns # 查看列明 5. df.describe() #可以快速查看数据的统计摘要 # 代码 Out[79]: a b count 7.000000 7.000000 mean 4.000000 10.285714 std 2.160247 6.210590 min 1.000000 1.000000 25% 2.500000 6.500000 50% 4.000000 13.000000 75% 5.500000 14.500000 max 7.000000 16.000000 7. df.T # 转置数据 8. df.sort_index(axis=1, ascending=False) # 轴排序,根据index排序 9. df.sort_values(by='a') # 值排序 根据“a”列的值排序 # 代码 df.sort_values(by='b') Out[82]: a b 1 2 1 2 3 2 0 1 11 3 4 13 4 6 14 5 5 15 6 7 16 9. df.to_numpy() # 输出底层数据的Numpy对象,输出不包含行索引和列标签,支持多种类型的转换, Pandas 和 NumPy 的本质区别:NumPy 数组只有一种数据类型,DataFrame 每列的数据类型各不相同 # 代码 df = pd.DataFrame({'a':[1,2,3,4],'b':[12,13,14,15]}) # 一个数据类型 df Out[84]: a b 0 1 12 1 2 13 2 3 14 3 4 15 df.to_numpy() Out[85]: array([[ 1, 12], [ 2, 13], [ 3, 14], [ 4, 15]], dtype=int64) dff = pd.DataFrame({'A':[1,2,'aaa','bbb'],'B':['aw','de','f',2]}) # 多种数据类型,object类型 dff Out[87]: A B 0 1 aw 1 2 de 2 aaa f 3 bbb 2 dff.to_numpy() Out[88]: array([[1, 'aw'], [2, 'de'], ['aaa', 'f'], ['bbb', 2]], dtype=object)

4. 选择数据

pandas 推荐优化过的数据访问方式 : .at , .iat,.loc,.iloc

# 以下操作的数据 dates = pd.date_range('20130101', periods=6) # 时间戳 df = pd.DataFrame(np.random.randn(6,4),index=datas,columns=list('abcd')) df Out[99]: a b c d 2013-01-01 -1.161403 -1.339640 0.566161 -1.680998 2013-01-02 -2.164866 -1.020372 -1.196390 -0.417629 2013-01-03 -0.177736 -0.197125 0.047798 -0.398154 2013-01-04 -1.221294 0.577236 0.208095 1.333940 2013-01-05 -0.018441 0.983021 0.832646 1.516306 2013-01-06 -0.737595 -0.381288 0.677688 -0.890492

4.1 获取数据

选取单列: df.a df[‘a’]

选取多列: df[[‘a’,‘b’]]

切片:[]

df[0:3] df['20130102':'20130104'] df[0:3] # 按行号提取数据 Out[100]: a b c d 2013-01-01 -1.161403 -1.339640 0.566161 -1.680998 2013-01-02 -2.164866 -1.020372 -1.196390 -0.417629 2013-01-03 -0.177736 -0.197125 0.047798 -0.398154 df['20130102':'20130104'] Out[104]: a b c d 2013-01-02 -2.164866 -1.020372 -1.196390 -0.417629 2013-01-03 -0.177736 -0.197125 0.047798 -0.398154 2013-01-04 -1.221294 0.577236 0.208095 1.333940

4.2 按标签选择 loc

df.loc[dates[0]] # 用标签提取一行df.loc[dates[0]:dates[3]] # 用标签提取多行df.loc[dates[0],[‘a’,‘b’]] # 一行里的多个列,返回对象降维df.loc[:, [‘a’,‘b’]] # 用标签提取ab 两列df.loc[dates[0],‘a’] # 提取标签值df.at[dates[0],‘a’] # 同5 提取标签值

4.3 根据位置选取 iloc

df.iloc[3] #按整数位提取df.iloc[2:3,0:2] # 按整数切片df.iloc[[1,2,4],[0,2]] # 整数列按位置切片df.iloc[1:3],:] # 显示整行df.iloc[:,[1:3]] # 显示整列df.iloc[1,1] # 提取值 ,1行1列的位置数‘

4.3 布尔索引

df[df.a>0] # 'a’列数值大于0的数据df[df>0] # 整个df数值大于0的数据df2[df2[‘E’].isin([‘two’, ‘four’])] :isin() 筛选df2[(df['A]>1)&(df[‘B’]<0.5)] : 布尔索引和逻辑表达式一起使用,多个条件通() 实现。 df2 Out[43]: A B C D E 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 one 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 one 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 three 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four 2013-01-06 -0.673690 0.113648 -1.478427 0.524988 three In [44]: df2[df2['E'].isin(['two', 'four'])] Out[44]: A B C D E 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four

4.4 赋值

根据新增列的index,直接对齐新增列的数据 se = pd.Series([1,2,3,4,5,6],index =pd.date_range('20130102',periods=6)) se Out[116]: 2013-01-02 1 2013-01-03 2 2013-01-04 3 2013-01-05 4 2013-01-06 5 2013-01-07 6 Freq: D, dtype: int64 df['F'] = se df Out[118]: a b c d F 2013-01-01 -1.161403 -1.339640 0.566161 -1.680998 NaN 2013-01-02 -2.164866 -1.020372 -1.196390 -0.417629 1.0 2013-01-03 -0.177736 -0.197125 0.047798 -0.398154 2.0 2013-01-04 -1.221294 0.577236 0.208095 1.333940 3.0 2013-01-05 -0.018441 0.983021 0.832646 1.516306 4.0 2013-01-06 -0.737595 -0.381288 0.677688 -0.890492 5.0 df.at[dates[0],‘a’] = 5 # 按照标签赋值 df.at[dates[0],'a'] = 55 df Out[121]: a b c d F 2013-01-01 55.000000 -1.339640 0.566161 -1.680998 NaN 2013-01-02 -2.164866 -1.020372 -1.196390 -0.417629 1.0 2013-01-03 -0.177736 -0.197125 0.047798 -0.398154 2.0 2013-01-04 -1.221294 0.577236 0.208095 1.333940 3.0 2013-01-05 -0.018441 0.983021 0.832646 1.516306 4.0 2013-01-06 -0.737595 -0.381288 0.677688 -0.890492 5.0 df.iat[2,2] = 99 # 按照位置赋值 df.iat[2,2] = 99 df Out[124]: a b c d F 2013-01-01 55.000000 -1.339640 0.566161 -1.680998 NaN 2013-01-02 -2.164866 -1.020372 -1.196390 -0.417629 1.0 2013-01-03 -0.177736 -0.197125 99.000000 -0.398154 2.0 2013-01-04 -1.221294 0.577236 0.208095 1.333940 3.0 2013-01-05 -0.018441 0.983021 0.832646 1.516306 4.0 2013-01-06 -0.737595 -0.381288 0.677688 -0.890492 5.0 df[df>0] = -df # 选择特定值赋值

5 缺失值

删除表中全部为NaN的行:data.dropna(axis = 0, how = ‘all’)删除表中任何含有NaN的行:data.dropna(axis = 0, how = ‘any’)删除表中全部为NaN的列:data.dropna(axis = 1, how = ‘all’)删除表中任何含有NaN的列:data.dropna(axis = 1 ,how = ‘any’)空值填充为values: df.fillna(values)提取中为空的bool掩码: df[pd.isna(df)]

总结

本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
最新回复(0)