1. Series的索引和切片

1.1 Series的索引:

可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时

返回的仍然是一个Series类型)。分为显示索引和隐式索引:

(1) 显式索引:

使用index中的元素作为索引值

使用.loc[ ]
s = pd.Series({'Python': 150, 'NumPy': 100, 'Pandas': 130}) s NumPy 100 Pandas
130 Python 150 dtype: int64 # 显示索引: 使用索引名 print(s['Python']) # 值,int类型
print(s.NumPy) # 使用2个中括号得到的类型:Series # 一次取多个元素 s[['Pandas', 'NumPy']]
s[['Pandas']] # 使用 loc[] print(s.loc['Python']) print(s.loc[['Pandas',
'NumPy']]) s.loc[['Pandas']] 150 100 150 Pandas 130 NumPy 100 dtype: int64
Pandas 130 dtype: int64
(2) 隐式索引:

使用整数作为索引值

使用.iloc[ ]
# 隐式索引:使用数字下标 print(s[0]) print(s[[0, 2]]) print(s[[0]]) # 使用 iloc[] s.iloc[0]
print(s.iloc[[0, 2]]) print(s.iloc[[0]]) # 下面这2个写法是错误的 # s.iloc['Python'] #
s.loc[0] 100 NumPy 100 Python 150 dtype: int64 NumPy 100 dtype: int64 NumPy 100
Python 150 dtype: int64 NumPy 100 dtype: int64
1.2 Series的切片
s = pd.Series({ '语文': 100, '数学': 150, '英语': 110, 'Python': 130, 'Pandas': 150,
'NumPy': 150 }) # 切片 # Series是一维数组 # 隐式切片: 左闭右开 s[1 : 4] s.iloc[1 : 4] # 显式切片:
左闭右闭 s['数学' : 'Python'] s.loc['数学' : 'Python'] 数学 150 英语 110 Python 130 dtype:
int64
2. DataFrame的索引与切片

2.1 DataFrame的索引

(1) 对列进行索引:

通过类似字典的方式;通过属性的方式。

可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name

属性也已经设置好了,就是相应的列名。
df = pd.DataFrame( data=np.random.randint(10, 100, size=(4, 6)), index=['小明',
'小红', '小黄', '小绿'], columns=['语文', '数学', '英语', '化学', '物理', '生物'] ) df.语文 #
Series类型 df['语文'] # 使用2个中括号得到的类型:DataFrame df[['语文', "化学"]] df[['语文']]

 (2) 对行进行索引:

使用.loc[ ]加index来进行行索引

使用.iloc[ ]加整数来进行行索引

同样返回一个Series,index为原来的columns。
# 不可以直接取行索引 # df['小明'] # df.小明 # DataFrame默认是先取列索引 # 取行索引 print(df.loc['小明'])
# Series类型 df.iloc[0] # 使用两个中括号: DataFrame类型 print(type(df.loc[['小明', '小绿']]))
df.loc[['小明']] print(df.iloc[[0, -1]]) df.iloc[[0, 3]] df.iloc[[0]]

(3) 对元素索引的方法:

使用列索引;使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]] 里面的[3,3]看做一个参数);

使用values属性(二维NumPy数组)。
# 先取列,再取行 print(df['语文']['小明']) df['语文'][0] df.语文[0] df.语文.小明 # 先取行,再取列
df.loc['小明']['语文'] df.loc['小明'][0] print(df.iloc[0][0]) df.iloc[0]['语文']
df.iloc[0, 0] df.loc['小明', '语文'] 36 36 36
2.2 DataFrame的切片

直接用中括号时:

索引优先对列进行操作;切片优先对行进行操作
# 行切片 print(df[1: 3]) # 左闭右开 df['小红' : '小黄'] # 左闭右闭 print(df.iloc[1: 3]) #
左闭右开 df.loc['小红' : '小黄'] # 左闭右闭

# 列切片 # 对列做切片,也必须先对行切片 df.iloc[ : , 1: 4] df.loc[:, "数学": "化学"]
总结:

取一行或一列 : 索引;取连续的多行或多列 : 切片;取不连续的多行或多列 : 中括号

3. 多层索引操作

(1) 隐式构造

最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
data = np.random.randint(0, 100, size=(6, 6)) index = [ ['1班', '1班', '1班',
'2班', '2班', '2班'], ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌'] ] columns = [ ['期中',
'期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语'] ] df =
pd.DataFrame(data=data, index=index, columns=columns)

Series也可以创建多层索引:
data = np.random.randint(0, 100, size=6) index = [ ['1班', '1班', '1班', '2班',
'2班', '2班'], ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌'] ] s = pd.Series(data=data,
index=index)

(2) 显示构造pd.MultiIndex

使用数组:
data = np.random.randint(0, 100, size=(6, 6)) index =
pd.MultiIndex.from_arrays( [ ['1班', '1班', '1班', '2班', '2班', '2班'], ['张三', '李四',
'王五', '鲁班', '张三丰', '张无忌'] ]) columns = [ ['期中', '期中', '期中', '期末', '期末', '期末'],
['语文', '数学', '英语', '语文', '数学', '英语'] ] df = pd.DataFrame(data=data,
index=index, columns=columns) df

 使用tuple:
data = np.random.randint(0, 100, size=(6, 6)) index =
pd.MultiIndex.from_tuples( ( ('1班', '张三'), ('1班', '李四'), ('1班', '王五'), ('2班',
'鲁班'), ('2班', '张三丰'), ('2班', '张无忌') ) ) columns = [ ['期中', '期中', '期中', '期末',
'期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语'] ] df =
pd.DataFrame(data=data, index=index, columns=columns) df
使用product:
data = np.random.randint(0, 100, size=(6, 6)) # 笛卡尔积: {a, b} {c, d} => {a, c},
{a, d}, {b, c}, {b, d} index = pd.MultiIndex.from_product( [ ['1班', '2班'],
['张三', '李四', '王五'] ]) columns = [ ['期中', '期中', '期中', '期末', '期末', '期末'], ['语文',
'数学', '英语', '语文', '数学', '英语'] ] df = pd.DataFrame(data=data, index=index,
columns=columns) df
注意:除了行索引index,列索引columns也能用同样的方法创建多层索引

4. 多层索引对象的索引与切片

4.1 Series的操作

对于Series来说,直接中括号[]与使用.loc()完全一样

索引:
# 显式索引 s['1班'] s.loc['1班'] s[['1班']] s[['1班', '2班']] s['1班']['张三']
s.loc['1班']['张三'] s.loc['1班', '张三'] s['1班', '张三'] # 隐式索引 s[0] s[1] s.iloc[1]
s.iloc[[1, 2]]

切片: 
# 切片 # 显式切片 s['1班' : '2班'] s.loc['1班' : '2班'] s.loc['1班'][:] # 建议使用隐式索引 s[1 :
5] s.iloc[1 : 5] 1班 李四 84 王五 14 2班 鲁班 64 张三丰 32 dtype: int32
4.2 DataFrame的操作

索引:
# 列索引 df['期中'] df['期中'][['数学']] df['期中']['数学'] df['期中', '数学'] df.期中.数学
df.iloc[:, 2] df.iloc[:, [0, 2, 1]] df.loc[:, ('期中', '数学')] # 行索引 df.loc['2班']
df.loc['2班'].loc['张三'] df.loc['2班', '张三'] df.loc[('2班', '张三')] df.iloc[1]
df.iloc[[1]] df.iloc[[1, 3, 4, 2]]

获取元素: 
# 获取元素 df['期中']['数学']['1班']['张三'] df['期中']['数学']['1班'][0] df.iloc[0, 1]
df.loc[('1班', '张三'), ('期中', '数学')] 72
 切片:
# 行切片 df.iloc[1 : 5] df.loc[('1班', '李四') : ('2班', '李四')] df.loc['1班' : '2班'] #
列切片 df.iloc[:, 1: 5] df.loc[:, '期中': '期末'] # df.loc[:, ('期中', '数学') : ('期末',
'数学')] # 报错 # 建议切片使用隐式索引
 5. 索引的堆叠

stack():使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

unstack():使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
# stack: 将列索引变成行索引 df.stack() # 默认是将最里层的列索引变成行索引 df.stack(level=-1)
df.stack(level=1) df2 = df.stack(level=0) df2
 
# unstack: 将行索引变成列索引 df2.unstack() df2.unstack(level=-1) df2.unstack(level=2)
df2.unstack(level=1) df2.unstack(level=0)

 使用fill_value填充:
df.unstack() df.unstack(fill_value=0)

 

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信