惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
博客园 - 司徒正美
C
Check Point Blog
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
IT之家
IT之家
B
Blog
博客园_首页
量子位
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
J
Java Code Geeks
H
Help Net Security
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News

极客兔兔

Go sync.Cond | Go 语言高性能编程 Go 死码消除与调试(debug)模式 | Go 语言高性能编程 Go sync.Once | Go 语言高性能编程 Go 逃逸分析 | Go 语言高性能编程 2020 年终总结 | 极客兔兔 Go struct 内存对齐 | Go 语言高性能编程 Go 空结构体 struct{} 的使用 | Go 语言高性能编程 控制协程(goroutine)的并发数量 | Go 语言高性能编程 | 极客兔兔 如何退出协程 goroutine (其他场景) | Go 语言高性能编程 如何退出协程 goroutine (超时场景) | Go 语言高性能编程 Go 语言陷阱 - 数组和切片 | Go 语言高性能编程 减小 Go 代码编译后的二进制体积 | Go 语言高性能编程 Go Reflect 提高反射性能 | Go 语言高性能编程 读写锁和互斥锁的性能比较 | Go 语言高性能编程 | 极客兔兔 for 和 range 的性能比较 | Go 语言高性能编程 切片(slice)性能及陷阱 | Go 语言高性能编程 | 极客兔兔 字符串拼接性能及原理 | Go 语言高性能编程 | 极客兔兔 pprof 性能分析 | Go 语言高性能编程 benchmark 基准测试 | Go 语言高性能编程 Go 语言高性能编程 | 极客兔兔 Go 接口型函数的使用场景 | 极客兔兔 Python 简明教程 | 快速入门 | 极客兔兔 Go 语言笔试面试题(代码输出) | 极客面试 | 极客兔兔 动手写RPC框架 - GeeRPC第七天 服务发现与注册中心(registry) | 极客兔兔 动手写RPC框架 - GeeRPC第六天 负载均衡(load balance) 动手写RPC框架 - GeeRPC第五天 支持HTTP协议 | 极客兔兔 动手写RPC框架 - GeeRPC第四天 超时处理(timeout) | 极客兔兔 动手写RPC框架 - GeeRPC第三天 服务注册(service register) 动手写RPC框架 - GeeRPC第二天 支持并发与异步的客户端 | 极客兔兔 动手写RPC框架 - GeeRPC第一天 服务端与消息编码 | 极客兔兔
Pandas 数据处理(一) - DataFrame 与 Series
2018-03-20 · via 极客兔兔

本文示例基于 Version 0.21.0

DataFrame和Series是pandas中最常见的2种数据结构。DataFrame可以理解为Excel中的一张表,Series可以理解为一张Excel表的一行或一列数据。

一、Series

Series可以理解为一维数组,它和一维数组的区别,在于Series具有索引。

1. 创建Series

  • 默认索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
money_series = pd.Series([200, 300, 10, 5], name="money") 
"""
0 200
1 300
2 10
3 5
Name: money, dtype: int64
"""
money_series[0]

money_series = money_series.sort_values()
"""
3 5
2 10
0 200
1 300
Name: money, dtype: int64
"""
money_series[0]

money_series.iloc[0]

  • 自定义索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
money_series = pd.Series([200, 300, 10, 5], index=['d', 'c', 'b', 'a'], name='money') 
"""
d 200
c 300
b 10
a 5
Name: money, dtype: int64
"""
money_series.index

money_series['a']

money_series = money_series.sort_index()
"""
a 5
b 10
c 300
d 200
Name: money, dtype: int64
"""
money_series.iloc[-1]

2. 切片与取值

  • 根据索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
money_series = pd.Series({'d': 200, 'c': 300, 'b': 10, 'a': 5}, name='money')
"""
a 200
b 300
c 10
d 5
Name: money, dtype: int64
"""
money_series.loc['a']

money_series.loc['c':'a':-1]
"""
c 10
b 300
a 200
Name: money, dtype: int64
"""
money_series.loc[['d', 'a']]
"""
d 5
a 200
"""
  • 根据序号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
money_series.iloc[0]

money_series.iloc[1:3]
"""
b 300
c 10
Name: money, dtype: int64
"""
money_series.iloc[[3, 0]]
"""
d 5
a 200
Name: money, dtype: int64
"""
  • 根据条件
1
2
3
4
5
6
7
8
9
10
11
12
13
money_series[money_series > 50] 
"""
c 300
d 200
Name: money, dtype: int64
"""
money_series[lambda x: x ** 2 > 50]
"""
b 10
c 300
d 200
Name: money, dtype: int64
"""

二、DataFrame

1. 创建DataFrame

  • 从字典中创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


df = pd.DataFrame({'单价': [100, 200, 30], '数量': [3, 3, 10]})
"""
单价 数量
0 100 3
1 200 3
2 30 10
"""


df = pd.DataFrame({'单价': [100, 200, 30], '数量': [3, 3, 10]}, index=['T001', 'T002', 'T003'])
"""
单价 数量
T001 100 3
T002 200 3
T003 30 10
"""
  • 通过Series创建
1
2
3
4
5
6
7
8
9
10
11
12
price_series = pd.Series([100, 200, 30], index=['T001', 'T002', 'T005'])
quantity_series = pd.Series([3, 3, 10, 2], index=['T001', 'T002', 'T003', 'T004'])
df = pd.DataFrame({'单价': price_series, '数量': quantity_series})

"""
单价 数量
T001 100.0 3.0
T002 200.0 3.0
T003 NaN 10.0
T004 NaN 2.0
T005 30.0 NaN
"""
  • 从Excel文件中读取,demo.dat
1
2
3
df = pd.read_excel("path/demo.xlsx", sheetname=0)

df = pd.read_excel("path/demo.xlsx", sheetname='销售记录')
  • 从普通文本中读取
1
2
3
4
5
6
编号|日期|单价|数量
T001|2018-03-02 12:34:05|100|3
T002|2018-03-02 13:04:05|200|3
T003|2018-03-03 18:12:31|30|10
T004|2018-03-04 20:34:05|400|2
T005|2018-03-02 20:34:05|500|1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
df = pd.read_csv('demo.dat', delimiter='|') 
"""
编号 日期 单价 数量
0 T001 2018-03-02 12:34:05 100 3
1 T002 2018-03-02 13:04:05 200 3
2 T003 2018-03-03 18:12:31 30 10
3 T004 2018-03-04 20:34:05 400 2
4 T005 2018-03-02 20:34:05 500 1
"""

df = pd.read_csv('demo.dat', delimiter='|', index_col='编号')
"""
日期 单价 数量
编号
T001 2018-03-02 12:34:05 100 3
T002 2018-03-02 13:04:05 200 3
T003 2018-03-03 18:12:31 30 10
T004 2018-03-04 20:34:05 400 2
T005 2018-03-02 20:34:05 500 1
"""

2. 获取列与行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
df['日期'] 
"""
0 2018-03-02 12:34:05
1 2018-03-02 13:04:05
2 2018-03-03 18:12:31
3 2018-03-04 20:34:05
4 2018-03-02 20:34:05
Name: 日期, dtype: object
"""
df[['单价', '数量']]
"""
单价 数量
0 100 3
1 200 3
2 30 10
3 400 2
4 500 1
"""
df.loc['T001']
df.iloc[0]
"""
日期 2018-03-02 12:34:05
单价 100
数量 3
Name: T001, dtype: object
"""
df.head(3)
df.tail(3)
"""
日期 单价 数量
编号
T003 2018-03-03 18:12:31 30 10
T004 2018-03-04 20:34:05 400 2
T005 2018-03-02 20:34:05 500 1
"""

3. 修改

  • 单价 * 2
1
2
3
4
5
6
7
8
9
10
11
12
13
df['单价'] *= 2



"""
日期 单价 数量
编号
T001 2018-03-02 12:34:05 200 3
T002 2018-03-02 13:04:05 400 3
T003 2018-03-03 18:12:31 60 10
T004 2018-03-04 20:34:05 800 2
T005 2018-03-02 20:34:05 1000 1
"""
  • 编号加上前缀
1
2
3
4
5
6
7
8
9
10

df.index = '2018_' + df.index
"""
日期 单价 数量
2018_T001 2018-03-02 12:34:05 200 3
2018_T002 2018-03-02 13:04:05 400 3
2018_T003 2018-03-03 18:12:31 60 10
2018_T004 2018-03-04 20:34:05 800 2
2018_T005 2018-03-02 20:34:05 1000 1
"""
  • 数量小于3的记录,单价 + 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def change_price(x):
if x['数量'] < 3:
return x['单价'] + 10
return x['单价']


df['单价'] = df.apply(change_price, axis=1)
"""
日期 单价 数量
2018_T001 2018-03-02 12:34:05 200 3
2018_T002 2018-03-02 13:04:05 400 3
2018_T003 2018-03-03 18:12:31 60 10
2018_T004 2018-03-04 20:34:05 810 2
2018_T005 2018-03-02 20:34:05 1010 1
"""
  • 增加物流公司
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
df['运费'] = pd.Series({'2018_T001': 10, '2018_T005': 12})
"""
日期 单价 数量 运费
2018_T001 2018-03-02 12:34:05 200 3 10.0
2018_T002 2018-03-02 13:04:05 400 3 NaN
2018_T003 2018-03-03 18:12:31 60 10 NaN
2018_T004 2018-03-04 20:34:05 810 2 NaN
2018_T005 2018-03-02 20:34:05 1010 1 12.0
"""

df.fillna(0)
"""
日期 单价 数量 运费
2018_T001 2018-03-02 12:34:05 200 3 10.0
2018_T002 2018-03-02 13:04:05 400 3 0.0
2018_T003 2018-03-03 18:12:31 60 10 0.0
2018_T004 2018-03-04 20:34:05 810 2 0.0
2018_T005 2018-03-02 20:34:05 1010 1 12.0
"""

4. 删除

  • 删除日期列(就地删除)
1
2
3
4
5
6
7
8
9
del df['日期']
"""
单价 数量 运费
2018_T001 200 3 10.0
2018_T002 400 3 NaN
2018_T003 60 10 NaN
2018_T004 810 2 NaN
2018_T005 1010 1 12.0
"""
  • 删除运费列(返回筛选后的)
1
2
3
4
5
6
7
8
9
10
11
new_columns = list(df.columns)
new_columns.remove('运费')
df = df[new_columns]
"""
单价 数量
2018_T001 200 3
2018_T002 400 3
2018_T003 60 10
2018_T004 810 2
2018_T005 1010 1
"""

附 推荐



上一篇 « TensorFlow入门(二) - mnist手写数字识别(模型保存加载) 下一篇 » Pandas 数据处理(二) - 筛选数据

© 2026 - 极客兔兔 - 沪ICP备18001798号-1

👁   📚