看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
数据框/数据帧(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,
)
说明:
此外还可以 dtype
指定数据类型,如果未指定,系统会自动推断。
和 Series 一样,DataFrame 可以由多种数据类型来定义:
此处较难理解,可先跳过。
当将字典传递给 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
'''
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
'''
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,生成 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 的一些基础的操作,可以先行了解一下,后边的教程会专门进行讲解。
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 的操作,教程后边会逐一介绍讲解。
更新时间:2024-04-30 22:10:37 标签:pandas dataframe