Pandas-第二章-索引

Pandas-第二章-索引

一、单级索引

1.loc方法、iloc方法、[]操作符
(a)loc方法,标签索引
(b)iloc方法,位置索引
(c)[]方法
2.布尔索引
(a)布尔符号:’&’, ‘|’, ‘~’,即and,or,not
(b)isin方法
3.快速标量索引
4.区间索引
(a)interval_range方法
(b)利用cut将数值列转为区间元素的分类变量,例如统计数学成绩的区间情况
(c)区间索引的选取

二、多级索引

1.创建多级索引
(a)from_tuple或from_arrays
(b)from_product
(c)指定df中的列创建
2.多层索引切片
3.多层索引中的slice对象
4.索引层的交换

三、索引设定

1.index_col参数
2.reindex和reindex_like
3.set_index和reset_index
4.rename_axis和rename

四、常用索引型函数

1.where函数
2.mask函数
3.query函数

五、重复元素处理

1.duplicated方法
2.drop_duplicxates方法

六、抽样函数

七、问题与练习

1.问题
【问题一】如何更改列或行的顺序?如何交换奇偶行(列)的顺序?
#更改顺序-方法一:自定义
order = []
df = df[order]
#更改顺序-方法二:删除后再插入
df_id = df.id
df = df.drop('id',axis=1)
df.insert(0,'id',df_id)

#交换奇偶行(列)顺序-方法一
df.reorder_levels([1,0,3,2],axis=0).sort_index().head()
#交换奇偶行(列)顺序-方法二
df.reorder_levels(['Address','School','Class'],axis=0).sort_index().head()
【问题二】如果要选出DataFrame的某个子集,请给出尽可能多的方法实现。

iloc表示位置索引(切片右端点不包含)
loc表示标签索引(所有在loc中使用的切片全部包含右端点)
[](切片操作)

【问题三】query函数比其他索引方法的速度更慢吗?在什么场合使用什么索引最高效?

query函数是基于DataFrame列的计算代数式,对于按照某列的规则进行过滤的操作。

【问题四】单级索引能使用Slice对象吗?能的话怎么使用,请给出一个例子。
row = 1103
df.loc[idx['row','row+1'],:]
【问题五】如何快速找出某一列的缺失值所在索引?
data.query('(index in ["NaN"])').index
【问题六】索引设定中的所有方法分别适用于哪些场合?怎么直接把某个DataFrame的索引换成任意给定同长度的索引?
【问题七】多级索引有什么适用场合?

多层切片、提取和对比

【问题八】什么时候需要重复元素处理?
2.练习
【练习一】现有一份关于UFO的数据集,请解决下列问题:
(a)在所有被观测时间超过60s的时间中,哪个形状最多?
df = pd.read_csv('data/UFO.csv')
print(df[df['duration (seconds)']>60]['shape'].value_counts().index[0])

‘light’

(b)对经纬度进行划分:-180°至180°以30°为一个划分,-90°至90°以18°为一个划分,请问哪个区域中报告的UFO事件数量最多?
latitude_interval = pd.cut(df['latitude'],bins=[-90,-72,-54,-36,-18,0,18,36,54,72,90])
longitude_interval = pd.cut(df['longitude'],bins=[-180,-150,-120,-90,-60,-30,0,30,60,90,120,150,180])
df_i1 = df.join(latitude_interval,rsuffix='_interval')
df_i2 = df_i1.join(longitude_interval,rsuffix='_interval')
df_i3 = df_i2.reset_index().set_index(['latitude_interval','longitude_interval'])
print(df_i3.head())
tp2 = df_i3.index.value_counts().head()
print(tp2)

# ((36, 54], (-90, -60])      27891
# ((18, 36], (-120, -90])     14280
# ((36, 54], (-120, -90])     11960
# ((18, 36], (-90, -60])       9923
# ((36, 54], (-150, -120])     9658
【练习二】现有一份关于口袋妖怪的数据集,请解决下列问题:
(a)双属性的Pokemon占总体比例的多少?
df = pd.read_csv('data/Pokemon.csv')
print(df['Type 2'].count()/df.shape[0])

#0.5175
(b)在所有种族值(Total)不小于580的Pokemon中,非神兽(Legendary=False)的比例为多少?
tp = df[df['Total']>=580]['Legendary'].value_counts()/df.shape[0]
tp.values[1]/(tp.values[1]+tp.values[0])

# 0.42477876106194695
(c)在第一属性为格斗系(Fighting)的Pokemon中,物攻排名前三高的是哪些?
df[df['Type 1']=='Fighting'].sort_values(by='Attack',ascending=False).head(3)
(d)请问六项种族指标(HP、物攻、特攻、物防、特防、速度)极差的均值最大的是哪个属性(只考虑第一属性,且均值是对属性而言)?
df['range'] = df.iloc[:,5:11].max(axis=1)-df.iloc[:,5:11].min(axis=1)
attribute = df[['Type 1','range']].set_index('Type 1')
max_range = 0
result = ''
for i in attribute.index.unique():
    temp = attribute.loc[i,:].mean()
    if temp.values[0] > max_range:
        max_range = temp.values[0]
        result = i
print(result)
(e)哪个属性(只考虑第一属性)的神兽比例最高?该属性神兽的种族值也是最高的吗?
print(df.query('Legendary == True')['Type 1'].value_counts(normalize=True).index[0])

attribute = df.query('Legendary == True')[['Type 1','Total']].set_index('Type 1')
max_value = 0
result = ''
for i in attribute.index.unique()[:-1]:
    temp = attribute.loc[i,:].mean()
    if temp[0] > max_value:
        max_value = temp[0]
        result = i
print(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值