我们将开始介绍Series、DataFrame和Index类,它们是pandas的基本构建块,并展示如何使用它们。在本节结束时,您将能够创建DataFrame并对它们执行操作以检查和筛选数据。
DataFrame剖析
DataFrame由一个或多个Series组成。Series的名称构成列名,行标签构成索引。
import pandas as pd
meteorites = pd.read_csv('../data/Meteorite_Landings.csv', nrows=5)
meteorites
数据源: NASA’s Open Data Portal
Series:
meteorites.name
'''
0 Aachen
1 Aarhus
2 Abee
3 Acapulco
4 Achiras
Name: name, dtype: object
'''
Columns:
meteorites.columns
'''
Index(['name', 'id', 'nametype', 'recclass', 'mass (g)', 'fall', 'year',
'reclat', 'reclong', 'GeoLocation'],
dtype='object')
'''
Index:
meteorites.index
'''
RangeIndex(start=0, stop=5, step=1)
'''
创建DataFrame
我们可以从各种来源创建DataFrame,比如其他Python对象、flat files、webscraping和API请求。在这里,我们将看到几个示例。
使用flat files(csv)
import pandas as pd
meteorites = pd.read_csv('../data/Meteorite_Landings.csv')
使用 API
import requests
response = requests.get(
'https://data.nasa.gov/resource/gh4g-9sfh.json',
params={'$limit': 50_000}
)
if response.ok:
payload = response.json()
else:
print(f'Request was not successful and returned code: {response.status_code}.')
payload = None
利用返回的payload创建DataFrame
import pandas as pd
df = pd.DataFrame(payload)
df.head(3)
提示:df.to_csv('data. csv ')将此数据写入名为data.csv的新文件。
观察数据
现在我们已经有了一些数据,我们需要对它进行一个初始检查,这将为我们提供关于数据的外观、有多少行/列以及我们有多少数据的信息。
我们来观察一下meteorites数据。
有多少行列
meteorites.shape
'''
(45716, 10)
'''
列名是什么
meteorites.columns
'''
Index(['name', 'id', 'nametype', 'recclass', 'mass (g)', 'fall', 'year',
'reclat', 'reclong', 'GeoLocation'],
dtype='object')
'''
每列当前保存的数据类型是什么?
meteorites.dtypes
'''
name object
id int64
nametype object
recclass object
mass (g) float64
fall object
year object
reclat float64
reclong float64
GeoLocation object
dtype: object
'''
数据是什么样的?
meteorites.head()
有时候文件末尾可能会有无关的数据,所以检查最下面的几行也很重要:
meteorites.tail()
获取有关DataFrame的一些信息
meteorites.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 45716 entries, 0 to 45715
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 45716 non-null object
1 id 45716 non-null int64
2 nametype 45716 non-null object
3 recclass 45716 non-null object
4 mass (g) 45585 non-null float64
5 fall 45716 non-null object
6 year 45425 non-null object
7 reclat 38401 non-null float64
8 reclong 38401 non-null float64
9 GeoLocation 38401 non-null object
dtypes: float64(3), int64(1), object(6)
memory usage: 3.5+ MB
'''
提取子集
使用DataFrame的一个关键部分是提取数据子集:查找符合特定标准集的行、隔离感兴趣的列/行等。缩小数据范围后,更容易发现数据的规律等,这将是许多分析任务的主干。
选择列
如果列名是有效的Python变量,我们可以选择列作为属性:
meteorites.name
'''
0 Aachen
1 Aarhus
2 Abee
3 Acapulco
4 Achiras
...
45711 Zillah 002
45712 Zinder
45713 Zlin
45714 Zubkovsky
45715 Zulu Queen
Name: name, Length: 45716, dtype: object
'''
如果不是,我们必须选择它们作为关键点。但是,我们可以通过以下方式一次选择多个列:
meteorites[['name', 'mass (g)']]
'''
name mass (g)
0 Aachen 21.0
1 Aarhus 720.0
2 Abee 107000.0
3 Acapulco 1914.0
4 Achiras 780.0
... ... ...
45711 Zillah 002 172.0
45712 Zinder 46.0
45713 Zlin 3.3
45714 Zubkovsky 2167.0
45715 Zulu Queen 200.0
45716 rows × 2 columns
'''
选择行
meteorites[100:104]
索引
我们使用iloc[]根据位置选择行和列:
meteorites.iloc[100:104, [0, 3, 4, 6]]
我们使用loc[]按名称选择:
meteorites.loc[100:104, 'mass (g)':'year']
使用布尔值过滤
指定要选择哪些行/列(True)和不要选择哪些行/列(False)的方法。
下面是在地球上发现的重量超过50克的陨石的代码示例:
(meteorites['mass (g)'] > 50) & (meteorites.fall == 'Found')
'''
0 False
1 False
2 False
3 False
4 False
...
45711 True
45712 False
45713 False
45714 True
45715 True
Length: 45716, dtype: bool
'''
重要提示:注意此处的语法。我们用圆括号将每个条件括起来,并使用按位运算符(&,|,~)而不是逻辑运算符(and、or、not)。
我们可以使用布尔掩码来选择重量超过100万克(1,000千克或大约2,205磅)的陨石子集:
meteorites[(meteorites['mass (g)'] > 1e6) & (meteorites.fall == 'Fell')]
提示:布尔掩码可以与loc[]和iloc[]一起使用。
此方法的替代方法是query()方法:
meteorites.query("`mass (g)` > 1e6 and fall == 'Fell'")
提示:这里,我们可以同时使用逻辑运算符和位运算符。
计算汇总统计
有多少陨石是被发现的,而不是被观测到的?
meteorites.fall.value_counts()
'''
Found 44609
Fell 1107
Name: fall, dtype: int64
'''
提示:可传入normalize=True以百分比形式查看结果。
陨石的平均质量是多少?
meteorites['mass (g)'].median()
'''
32.6
'''
我们可以更进一步,看看分位数:
meteorites['mass (g)'].quantile([0.01, 0.05, 0.95, 0.99])
'''
0.01 0.44
0.05 1.10
0.95 4000.00
0.99 50600.00
Name: mass (g), dtype: float64
'''
最重的陨石的质量是多少?
meteorites['mass (g)'].max()
'''
60000000.0
'''
我们来提取一下这块陨石的信息:
meteorites.loc[meteorites['mass (g)'].idxmax()]
'''
name Hoba
id 11890
nametype Valid
recclass Iron, IVB
mass (g) 60000000.0
fall Found
year 01/01/1920 12:00:00 AM
reclat -19.58333
reclong 17.91667
GeoLocation (-19.58333, 17.91667)
Name: 16392, dtype: object
'''
这个数据集中有多少不同类型的陨石?
meteorites.recclass.nunique()
'''
466
'''
一些例子:
meteorites.recclass.unique()[:14]
'''
array(['L5', 'H6', 'EH4', 'Acapulcoite', 'L6', 'LL3-6', 'H5', 'L',
'Diogenite-pm', 'Unknown', 'H4', 'H', 'Iron, IVA', 'CR2-an'],
dtype=object)
'''
获取数据本身的一些汇总统计信息
我们可以一次获得所有列的通用汇总统计信息。默认情况下,这将只是数字列,但在这里,我们将汇总所有内容:
meteorites.describe(include='all')