pandas 数据框 DataFrame

⟁ 365提款10万一般多久 ⏳ 2025-09-15 16:22:47 👤 admin 👁️ 6442 ❤️ 777
pandas 数据框 DataFrame

看过来

《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。

本内容来自:https://gairuo.com

数据框/数据帧(DataFrame)是二维数据结构,数据以行和列的形式排列表达一定的数据意义。类似于 CSV、Excel 、SQL 结果表,或者由 Series 组成。

学习提示

本文内容需要一些背景知识,如果是初学者可以跳过,在学习过程中可以再来查看。

定义方法

df = pd.DataFrame(

data=None,

index: 'Axes | None' = None,

columns: 'Axes | None' = None,

dtype: 'Dtype | None' = None,

copy: 'bool | None' = None,

)

说明:

data: 具体数据,结构化或者同构的 ndarray、可迭代对象、字典或者 DataFrame

index: 索引,类似数组的对象,支持解包,如果没有指定会自动生成 RangeIndex (0, 1, 2, …, n)

columns: 列索引,表头,如果没有指定会自动生成 RangeIndex (0, 1, 2, …, n)

copy:bool 或者 None, 默认为 None,从输入复制数据。对于 dict 数据,默认值 None 的行为类似于 copy=True。对于 DataFrame 或 2d ndarray 输入,默认值 None 的行为类似于 copy=False。 在版本 1.3.0 的变化

此外还可以 dtype 指定数据类型,如果未指定,系统会自动推断。

可定义的结构

和 Series 一样,DataFrame 可以由多种数据类型来定义:

一维 numpy.ndarray、字典、列表

二维 numpy.ndarray,三维及以上的不可以

结构化的 ndarray

一个或者多个 Series

一个或者多个 DataFrame 也可以定义

字典的 copy=False

此处较难理解,可先跳过。

当将字典传递给 copy=False 的 DataFrame 时,将不再进行复制:

arr = np.array([1, 2, 3])

df = pd.DataFrame({"A": arr, "B": arr.copy()}, copy=False)

df

'''

A B

0 1 1

1 2 2

2 3 3

'''

df[“A”] 仍然是 arr 上的视图:

arr[0] = 0

# assert df.iloc[0, 0] == 0

'''

A B

0 0 1

1 2 2

2 3 3

'''

不传递 copy 时的默认行为将保持不变,即将创建一份副本。

创建生成

下边介绍的是利用现有的 python 数据创建一个 DataFrame,但是大多数情况下我们都是从数据文件如 CSV、Excel 中取得数据,不过,了解这部分知道可以让我们更好地理解 DataFrame 的数据机制。

字典

d = {'国家': ['中国', '美国', '日本'],

'人口': [14.33, 3.29, 1.26]}

df = pd.DataFrame(d)

df

'''

国家 人口

0 中国 14.33

1 美国 3.29

2 日本 1.26

'''

可以指定索引,会覆盖原有的索引:

df = pd.DataFrame(d, index=['a', 'b', 'c'])

df

'''

国家 人口

a 中国 14.33

b 美国 3.29

c 日本 1.26

'''

Series 组成的字典

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)

df

'''

one two

a 1.0 1.0

b 2.0 2.0

c 3.0 3.0

d NaN 4.0

'''

指定索引和列名,会覆盖原有的列名:

pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])

'''

two three

d 4.0 NaN

b 2.0 NaN

a 1.0 NaN

'''

ndarrays 或列表组成的字典

d = {'one': [1., 2., 3., 4.],

'two': [4., 3., 2., 1.]}

pd.DataFrame(d)

'''

one two

0 1.0 4.0

1 2.0 3.0

2 3.0 2.0

3 4.0 1.0

'''

pd.DataFrame(d, index=['a', 'b', 'c', 'd'])

'''

one two

a 1.0 4.0

b 2.0 3.0

c 3.0 2.0

d 4.0 1.0

'''

同构的数组数据

# 创建一个空的 2x3 数组

data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])

# 给这个数据填入具体数据值

data[:] = [(1, 2., 'Hello'), (2, 3., "World")]

# 生成 DataFrame

pd.DataFrame(data)

'''

A B C

0 1 2.0 b'Hello'

1 2 3.0 b'World'

'''

# 指定索引

pd.DataFrame(data, index=['first', 'second'])

'''

A B C

first 1 2.0 b'Hello'

second 2 3.0 b'World'

'''

# 指定列名

pd.DataFrame(data, columns=['C', 'A', 'B'])

'''

C A B

0 b'Hello' 1 2.0

1 b'World' 2 3.0

'''

字典和列表

# 定义一个字典列表

data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]

# 生成 DataFrame 对象

pd.DataFrame(data2)

'''

a b c

0 1 2 NaN

1 5 10 20.0

'''

# 指定索引

pd.DataFrame(data2, index=['first', 'second'])

'''

a b c

first 1 2 NaN

second 5 10 20.0

'''

# 指定列名

pd.DataFrame(data2, columns=['a', 'b'])

'''

a b

0 1 2

1 5 10

'''

元组组成的字典

# 一个双索引的例子

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}})

'''

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

'''

由 Series 生成

可以将多个同索引的 Series,生成 DataFrame:

s1 = pd.Series(['a', 'b', 'c', 'd', 'e'])

pd.DataFrame(s1)

混杂的结构

# 从字典里生成

pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]))

# 如字典键为 [‘index’, ‘columns’, ‘data’, ‘index_names’, ‘column_names’]

pd.DataFrame.from_dict({...}, orient='tight')

# 从列表、元组、ndarray 中创建

pd.DataFrame.from_records([(1, 2., b'Hello'), (2, 3., b'World')])

# 列内容为一个字典

pd.json_normalize(df.col)

df.col.apply(pd.Series)

例:可实现在构造 df 的时候给索引起名字。

data = {

'index': [*'xy'],

'columns': [*'ab'],

'data': [[1, 3], [2, 4]],

'index_names': 'T',

'column_names': 'S'

}

df = pd.DataFrame.from_dict(data, orient='tight')

df

'''

S a b

T

x 1 3

y 2 4

'''

DataFrame 的操作

以下介绍的是 DataFrame 的一些基础的操作,可以先行了解一下,后边的教程会专门进行讲解。

访问索引和列名

df.index

# Index(['a', 'b', 'c', 'd'], dtype='object')

df.columns

# Index(['one', 'two'], dtype='object')

选择增加修改列

# 选择列,结果是一个 Series

df['one']

'''

a 1.0

b 2.0

c 3.0

d NaN

Name: one, dtype: float64

'''

# 定义一个固定值的列

df['foo'] = 'bar'

# 定义的新列取某列的部分值

df['one_trunc'] = df['one'][:2]

# 定义一个新列,由已有的两列相乘

df['three'] = df['one'] * df['two']

# 新增加的列返回的是一个逻辑运算值

df['flag'] = df['one'] > 2

df

'''

one two three flag

a 1.0 1.0 1.0 False

b 2.0 2.0 4.0 False

c 3.0 3.0 9.0 True

d NaN 4.0 NaN False

'''

# 在列索引位 1 处理插入名为 bar 的列,值取 df.one

df.insert(1, 'bar', df['one'])

# 删除一个列

del df['two']

three = df.pop('three')

用方法链创建新列

方法链(method chains)是一种预计算,并没有改变原变量的数据,同时使用起来非常方便,不需要频繁给变量赋值,后期的数据分析极力推荐这种思路,后期会专门讲解。用 括号 () 是为了方便在多条语句的情况下方便换行对齐。

# 定义一个名为 rate 的新列,并给定计算公式

(df.assign(rate=df['one']/df['two'])

.head())

# 可以用 lambda 进行计算,变量 x 是指整个 df

df.assign(rate=lambda x:x['one']/x['two']).head()

# 可指定多个

df.assign(rate=lambda x:x['one']/x['two'],

rate2=lambda x:x['one']+x['two']).head()

选择数据

常用操作:

Operation

Syntax

Result

选择列

df[col]

Series

按索引选择行

df.loc[label]

Series

按数字索引选择行

df.iloc[loc]

Series

使用切片选择行

df[5:10]

DataFrame

用表达式筛选行

df[bool_vec]

DataFrame

df['one']

df.loc['a']

df[1:3]

df.iloc[3]

df[df.one > 1]

数据的转置

可以会数据沿对角线进行转置,即行转列,列转行

df

'''

one two

a 1.0 1.0

b 2.0 2.0

c 3.0 3.0

d NaN 4.0

'''

df.T

'''

a b c d

one 1.0 2.0 3.0 NaN

two 1.0 2.0 3.0 4.0

'''

其他

对 DataFrame 的操作非常多,上文仅列出了部分,让大家感受一下相关的基础操作,后续我们的数据分析大多情况都是围绕着 DataFrame 的操作,教程后边会逐一介绍讲解。

相关内容

pandas习题 065:用字典构造多层列索引 DataFrame

2024-11-07 20:22:00

pandas 配合 openpyxl 完成 Excel 指定单元格样式

2024-06-16 17:19:07

pandas习题 036:选择 DataFrame 的多个列

2024-05-26 19:08:08

pandas习题 035:选择 DataFrame 其中一列

2024-05-26 18:27:03

pandas习题 033:将 NumPy 结构化数组转为 DataFrame

2024-04-07 20:36:16

pandas习题 031:以字典的键为索引构造 DataFrame

2024-04-06 19:29:30

pandas习题 030:用 NumPy 构造一个指定形状的 DataFrame

2024-03-21 10:27:11

pandas习题 029:用 Series 构造 DataFrame

2024-03-20 10:31:51

pandas习题 028:用命名元组 namedtuple 构造 DataFrame

2024-03-20 10:29:02

pandas习题 027:用数据类 dataclasses 构造 DataFrame

2024-03-20 10:26:14

pandas习题 026:用 NumPy ndarray 构造 DataFrame

2024-03-20 09:55:00

pandas习题 025:用二维列表构造 DataFrame

2024-03-20 09:44:44

pandas习题 024:用字典构造 DataFrame

2024-03-20 09:34:45

pandas 两个不同结构 DataFrame 相加合并

2022-09-02 17:30:42

pandas 根据文本数据提取特征

2022-08-29 17:11:09

pandas 生成任意行循环取值数据

2022-03-13 00:19:05

pandas 数字序列每5个转成一列

2021-04-27 17:21:14

< 序列 Series

pandas 教程

数据类型 dtypes >

更新时间:2024-04-30 22:10:37

标签:pandas

dataframe

相关推荐