pandas索引


一、小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的比例最高?该属性神兽的种族值均值也是最高的吗?


总结

还需修改改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值