一、小tips
一、索引:进行多行索引时,用两个中括号括起来。
二、多行索引时可以同时对列进行索引。
例:
import pandas as pd
df = pd.read_csv('table.csv',index_col='ID')
print(df.head())
print(df.loc[[1103, 2304, 1104], 'Height'])
'''
ID
1103 186
2304 164
1104 167
Name: Height, dtype: int64
'''
三、用函数可以找出列中特殊的值(要用双等号“==”)
例:
df = pd.read_csv('table.csv',index_col='ID')
print(df.head())
print(df.loc[lambda x:x['Gender']=='M'].head())
'''
School Class Gender Address Height Weight Math Physics
ID
1101 S_1 C_1 M street_1 173 63 34.0 A+
1103 S_1 C_1 M street_2 186 82 87.2 B+
1201 S_1 C_2 M street_5 188 68 97.0 A-
1203 S_1 C_2 M street_6 160 53 58.8 A+
1301 S_1 C_3 M street_4 161 68 31.5 B+
'''
四、iloc与loc不同,前者的切片时前开后闭的。
例:
df = pd.read_csv('table.csv',index_col='ID')
print(df.head())
print(df.iloc[1:4])
'''
ID
1102 S_1 C_1 F street_2 192 73 32.5 B+
1103 S_1 C_1 M street_2 186 82 87.2 B+
1104 S_1 C_1 F street_2 167 81 80.4 B-
'''
二、多级索引
一、通过多种方式创建多级索引。
举例其中一种:
L1 = list('AABB')
L2 = list('aabb')
tuples = list(zip(L1, L2))
mul_index = pd.MultiIndex.from_tuples(tuples, names=('Upper', 'Lower'))
print(pd.DataFrame({'Score':['perfect', 'good', 'fair','bad']}, index=mul_index))
'''
Score
Upper Lower
A a perfect
a good
B b fair
b bad
'''
二、切片
1、第一类特殊情况:由元组构成列表
例:
print(df_using_mul.sort_index().loc[[('C_2','street_7'),('C_3','street_2')]])
'''
School Gender Height Weight Math Physics
Class Address
C_2 street_7 S_2 F 194 77 68.5 B+
street_7 S_2 F 183 76 85.4 B
C_3 street_2 S_1 M 195 70 85.2 A
'''
2、第二类特殊情况:由列表构成元组
例:
print(df_using_mul.sort_index().loc[(['C_2','C_3'],['street_4','street_7']),:])
'''
School Gender Height Weight Math Physics
Class Address
C_2 street_4 S_1 F 176 94 63.5 B-
street_4 S_2 M 155 91 73.8 A+
street_7 S_2 F 194 77 68.5 B+
street_7 S_2 F 183 76 85.4 B
C_3 street_4 S_1 M 161 68 31.5 B+
street_4 S_2 F 157 78 72.3 B+
street_4 S_2 M 187 73 48.9 B
street_7 S_1 M 188 82 49.7 B
street_7 S_2 F 190 99 65.9 C
'''
三、问题与习题
1.问题
1、如何更改列或行的顺序?如何交换奇偶行(列)的顺序?
答:
2、如果要选出DataFrame的某个子集,请给出尽可能多的方法实现。
答:iloc表示位置索引(切片右端点不包含)
loc表示标签索引(所有在loc中使用的切片全部包含右端点)
3、query函数比其他索引方法的速度更慢吗?在什么场合使用什么索引最高效?
答:query函数是基于DataFrame列的计算代数式,对于按照某列的规则进行过滤的操作。
4、单级索引能使用Slice对象吗?能的话怎么使用,请给出一个例子。
答:
idx=pd.IndexSlice
print(idx[1:9:2])
'''
slice(1, 9, 2)
'''
5、如何快速找出某一列的缺失值所在索引?
答:
df = pd.read_csv('table.csv',index_col='ID')
print(df.head())
print(df.query('(index in ["NaN"])').index)
'''
School Class Gender Address Height Weight Math Physics
ID
1101 S_1 C_1 M street_1 173 63 34.0 A+
1102 S_1 C_1 F street_2 192 73 32.5 B+
1103 S_1 C_1 M street_2 186 82 87.2 B+
1104 S_1 C_1 F street_2 167 81 80.4 B-
1105 S_1 C_1 F street_4 159 64 84.8 B+
Int64Index([], dtype='int64', name='ID')
'''
6、索引设定中的所有方法分别适用于哪些场合?怎么直接把某个DataFrame的索引换成任意给定同长度的索引?
答:
7、对于多层索引,怎么对内层进行条件筛选?
答:多层切片、提取和对比
8、swaplevel中的axis参数为1时,代表什么意思?i和j只能是数值型吗?
答:
2.练习
1、现有一份关于UFO的数据集,请解决下列问题:
(a)在所有被观测时间超过60s的时间中,哪个形状最多?
df = pd.read_csv('UFO.csv')
print(df[df['duration (seconds)']>60]['shape'].value_counts().index[0])
'''
light
'''
(b)对经纬度进行划分:-180°至180°以30°为一个经度划分,-90°至90°以18°为一个维度划分,请问哪个区域中报告的UFO事件数量最多?
2、现有一份关于口袋妖怪的数据集,请解决下列问题:
(a)双属性的Pokemon占总体比例的多少?
df = pd.read_csv('Pokemon.csv')
print(df['Type 2'].count()/df.shape[0]) #0.5175
(b)在所有种族值(Total)不小于580的Pokemon中,非神兽(Legendary=False)的比例为多少?
(c)在第一属性为格斗系(Fighting)的Pokemon中,物攻排名前三高的是哪些?
print(df[df['Type 1']=='Fighting'].sort_values(by='Attack',ascending=False).head(3))
'''
# Name Type 1 ... Speed Generation Legendary
498 448 LucarioMega Lucario Fighting ... 112 4 False
594 534 Conkeldurr Fighting ... 45 5 False
74 68 Machamp Fighting ... 55 1 False
[3 rows x 13 columns]
'''
(d)请问六项种族指标(HP、物攻、特攻、物防、特防、速度)极差的均值最大的是哪个属性(只考虑第一属性,且均值是对属性而言)?
(e)哪个属性(只考虑第一属性)神兽占总Pokemon的比例最高?该属性神兽的种族值均值也是最高的吗?
总结
还需修改改进。