题题题。。。
【问题一】 如何更改列或行的顺序?如何交换奇偶行(列)的顺序?
答:①可以使用 reindex() 函数来从新定义行 或 列的顺序
df.reindex(index=[行名排序...])
df.reindex(columns=[列名的排序...])
② 有点难度。。。
【问题二】 如果要选出DataFrame的某个子集,请给出尽可能多的方法实现
答:
按 索引方式可分为 单行(列)索引,多行(列)索引,混合索引,函数式索引
按 方法可分为、df.loc()、df.iloc()、df.query()
或者简单暴力的切片形式 df[a: b]
【问题三】 query函数比其他索引方法的速度更慢吗?在什么场合使用什么索引最高效?
答:
①query 函数比其他索引方法更快,可以避免潜在的数据在不同内存缓存间的移动,节省内存,语法简洁。
②当 DataFrame 占用内存较多时,推荐使用 eval()/query()
【问题四】 单级索引能使用Slice对象吗?能的话怎么使用,请给出一个例子。
答:能
import pandas as pd
df = pd.read_csv(r'C:\Users\YANG\Desktop\joyful-pandas-master\data\table.csv', index_col='ID')
idx = pd.IndexSlice
print(df.loc[idx[df['Math']>90]])
'''
School Class Gender Address Height Weight Math Physics
ID
1201 S_1 C_2 M street_5 188 68 97.0 A-
2304 S_2 C_3 F street_6 164 81 95.5 A-
'''
【问题五】 如何快速找出某一列的缺失值所在索引?
答:
df = pd.DataFrame({'A':list('abcde')}) # 创建,使用默认索引
df = df.assign(B=pd.Series(list('efgi'))) # 增加一列,故意少一个元素
print(df) # 打印 df 看看
print(np.where(df['B'].isnull())) # 找索引
'''
A B
0 a e
1 b f
2 c g
3 d i
4 e NaN
(array([4], dtype=int64),) # 4 就代表了缺少的元素的索引值
'''
【问题六】 索引设定中的所有方法分别适用于哪些场合?怎么直接把某个DataFrame的索引换成任意给定同长度的索引?
答:
① reindex和reindex 用于重新索引,很多时候用于重新排序
② set_index和reset_index 重新设定索引,可把某些列设置为索引
③ rename_axis针对多级索引的方法,作用是修改某一层的索引名,而不是索引标签和rename方法用于修改列或者行索引标签,而不是索引名
【问题七】 对于多层索引,怎么对内层进行条件筛选?
答:
参考答案:
df_s.loc[idx['B':,df_s.iloc[:,0]>0.6],:]
【问题八】 swaplevel 中的axis参数为1时,代表什么意思?i和j只能是数值型吗?
答:
① axis = 1表示对行操作,axis = 0表示对列操作
② i 和 j 一般都是数值型(表示绝对位置),但其也可以是字符串型(即列名,行名)
【练习一】 现有一份关于UFO的数据集,请解决下列问题:
import pandas as pd
df = pd.read_csv(r'C:\Users\YANG\Desktop\joyful-pandas-master\data\UFO.csv')
print(df.head())
datetime shape duration (seconds) latitude longitude
0 10/10/1949 20:30 cylinder 2700.0 29.883056 -97.941111
1 10/10/1949 21:00 light 7200.0 29.384210 -98.581082
2 10/10/1955 17:00 circle 20.0 53.200000 -2.916667
3 10/10/1956 21:00 circle 20.0 28.978333 -96.645833
4 10/10/1960 20:00 light 900.0 21.418056 -157.803611
(a)在所有被观测时间超过60s的时间中,哪个形状最多?
答:利用多层索引
df = pd.read_csv(r'C:\Users\YANG\Desktop\joyful-pandas-master\data\UFO.csv')
print(df.head())
print(df[df['duration (seconds)']>60]['shape'].value_counts().index[0]) # light
【练习二】 现有一份关于口袋妖怪的数据集,请解决下列问题:
import pandas as pd
df = pd.read_csv(r'C:\Users\YANG\Desktop\joyful-pandas-master\data\Pokemon.csv')
print(df.head())
# Name Type 1 ... Speed Generation Legendary
0 1 Bulbasaur Grass ... 45 1 False
1 2 Ivysaur Grass ... 60 1 False
2 3 Venusaur Grass ... 80 1 False
3 3 VenusaurMega Venusaur Grass ... 80 1 False
4 4 Charmander Fire ... 65 1 False
a)双属性的Pokemon占总体比例的多少?
答:由于属性1 必然存在,所以只需检查属性2是否存在就能统计双属性的个数
a = df['Type 2'].count() # 414
b = df.shape[0] # 800
print(a/b) # 0.5175
(b)在所有种族值(Total)不小于580的Pokemon中,非神兽(Legendary=False)的比例为多少?
a = df[df['Total'] >= 580]['Legendary']
print(a.count()) # 113
print(a.value_counts()) # False 48
print(48/113) # 0.4247
(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
'''