索引
- pandas的索引对象可以包含重复的标签
- DataFrame对象也可以有重复的columns或者index 但是请尽量不要这么做!
- 索引可以再创建的时候设置,但是不可以创建好后更改为别的值
- 更改索引,也是在原有索引范围内更改,多出的索引值自动填充 NaN 或者指定填充值
缺失值指定填充方式method参数,比如ffill表示向前填充,bfill表示向后填充
import pandas as pd
obj = pd.Series(range(3),index = ['a','b','c'])
obj2=obj.reindex(['c','b','a','w'],method='ffill')
print(obj2)
>>>
c 2
b 1
a 0
w 2
dtype: int64
- DataFrame这种二维对象,如果执行reindex方法时只提供一个列表参数,则默认是修改行索引。可以用关键字参数columns指定修改的是列索引
DataFrame删除 行/列
通过drop方法,可以删除Series的一个元素,
或者DataFrame的一行或一列。
默认情况下,drop方法按行删除,且不会修改原数据,但指定axis=1则按列删除,指定inplace=True则修改原数据
----------------------------------pandas-----------------------------
创建s矩阵 s= pd.Series(np.arange(5),index=list('abcde'))
s:
a 0
b 1
c 2
d 3
e 4
dtype: int32
删除索引为c的行
new_s = s.drop('c')
new_s
a 0
b 1
d 3
e 4
dtype: int32
矩阵s不随之改变:
a 0
b 1
c 2
d 3
e 4
dtype: int32
------------------------------------DataFrame---------------------------------------
创建矩阵df:df = pd.DataFrame(np.arange(16).reshape(4,4),columns=['one','two','three','four'])
one two three four
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
删除索引为2的行:
df.drop(2)
one two three four
0 0 1 2 3
1 4 5 6 7
3 12 13 14 15
指定删除列,而不是默认的行
df.drop('two',axis = 1)
one three four
0 0 2 3
1 4 6 7
2 8 10 11
3 12 14 15
原始数据不随之改变
df
one two three four
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
原始数据随之改变
df.drop(2,inplace=True)
df
one two three four
0 0 1 2 3
1 4 5 6 7
3 12 13 14 15
切片
Series
建立一个原始一维数据
import pandas as pd
import numpy as np
se = pd.Series(np.linspace(1,4,5),index=list('abcde'))
print(se)
>>>
a 1.00
b 1.75
c 2.50
d 3.25
e 4.00
dtype: float64
使用建立的索引查看
带‘,‘号查看的索引位置 要使用两个括号‘[[ ]]’
单独查看单个索引的值 一般都是 隐性索引(隐藏索引值显示)
#-------------------------------------------------------------
#-------------------------------------------------------------
print(se['b']) #使用建立时的索引
>>>1.75 # 隐性索引(不显示索引值)
#-------------------------------------------------------------
print('--'*20)
#-------------------------------------------------------------
print(se[['b','c','d']]) #使用建立时的索引
>>>
b 1.75
c 2.50
d 3.25
dtype: float64 #显性索引 显示索引值
#-------------------------------------------------------------
print('--'*20)
#-------------------------------------------------------------
print(se['b':'c'])
>>>
b 1.75
c 2.50
dtype: float64 #显性索引 显示索引值
#-------------------------------------------------------------
print('--'*20)
#-------------------------------------------------------------
se['b':'c']=6 #更改索引对应的值 #左闭右也闭
print(se)
>>>
a 1.00
b 6.00
c 6.00
d 3.25
e 4.00
dtype: float64 #显性索引 显示索引值
#-------------------------------------------------------------
print('--'*20)
#-------------------------------------------------------------
se['b','c']=66 #更改索引对应的值
print(se)
>>>
a 1.00
b 66.00
c 66.00
d 3.25
e 4.00
dtype: float64 # 显性索引 显示索引值
使用默认的索引查看
带‘,‘号查看的索引位置 要使用两个括号‘[[ ]]’
单独查看单个索引的值 一般都是 隐性索引(隐藏索引值显示)
#-------------------------------------------------------------
#-------------------------------------------------------------
print(se[2])
>>>2.5 #隐性索引(不显示索引值)
#-------------------------------------------------------------
print('--'*20)
#-------------------------------------------------------------
print(se[[1,3]]) #注意双括号“[[ ]]”
>>>
b 1.75
d 3.25
dtype: float64 #显性索引 显示索引值
#-------------------------------------------------------------
print('--'*20)
#-------------------------------------------------------------
print(se[2:4]) #左闭右开
>>>
c 2.50
d 3.25
dtype: float64 #显性索引 显示索引值
#-------------------------------------------------------------
print('--'*20)
#-------------------------------------------------------------
print(se[se>2]) #对值比较 显示符合要求的数据
>>>
c 2.50
d 3.25
e 4.00
dtype: float64 #显性索引 显示索引值
DataFrame
建立原始数据
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=['one','two','three','four'])
print(df)
>>>
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
切片 - 列
带‘,‘号查看的索引位置 要使用两个括号‘[[ ]]’
单独查看单个列的值 一般都是 隐性索引(隐藏索引值显示)
#-------------------------------------------------------------
print(df['two'])
>>>
a 1
b 5
c 9
d 13
Name: two, dtype: int32 #隐藏表头
#-------------------------------------------------------------
print(df[['two','one']])
>>>
two one
a 1 0
b 5 4
c 9 8
d 13 12 #显示表头
#-------------------------------------------------------------
print(df['two':'one'])
>>>#无法按照列名的范围去切片
#-------------------------------------------------------------
print(df<5)
>>>
one two three four
a True True True True
b True False False False
c False False False False
d False False False False #布尔值判断显示表头
#-------------------------------------------------------------
df[df<5]=0
print(df)
>>>
one two three four
a 0 0 0 0
b 0 5 6 7
c 8 9 10 11
d 12 13 14 15 #符合条件的数据 改变其数据值
切片 - 行
不可以直接切片索引行 (原始索引/建立索引都不可以)
例:print(df[‘b’])
会报错
print(df[:2])
>>>
one two three four
a 0 1 2 3
b 4 5 6 7 #显示表头
#-------------------------------------------------------------
print(df['c':'d']) #左闭右也闭
>>>
one two three four
c 8 9 10 11
d 12 13 14 15 #显示表头
DataFrame函数查看行切片
老版本的ix标签已经不提倡使用了
原始数据 df
one two three four
a 0 0 0 0
b 0 5 6 7
c 8 9 10 11
d 12 13 14 15
#-------------------------------------------------------------
df.loc['b', ['two','four']] # 使用显式索引值,用逗号分隔行和列参数
>>>
two 5
four 7
Name: b, dtype: int32
#-------------------------------------------------------------
df.loc['b':, 'two':'four'] # 切片方式,注意区间
>>>
two three four
b 5 6 7
c 9 10 11
d 13 14 15
#-------------------------------------------------------------
df.iloc[2, [3, 0, 1]] # 用隐含的整数索引检索,但是这个打印格式好别扭
>>>
four 11
one 8
two 9
Name: c, dtype: int32
#-------------------------------------------------------------
df.iloc[2]
>>>
one 8
two 9
three 10
four 11
Name: c, dtype: int32
#-------------------------------------------------------------
df.iloc[1:,2:3] # 注意区间
>>>
three
b 6
c 10
d 14
#-------------------------------------------------------------
df.iloc[:,:3][df.three>5] # 先切片,再布尔判断
>>>
one two three
b 0 5 6
c 8 9 10
d 12 13 14