1.重建索引:
reindex()
方法用于创建一个符合新索引的新对象。
调用reindex()
方法会将数据按照新的索引进行排序,如果某个索引值之前不存在的话,则会引入缺失值NaN。
import pandas as pd
df = pd.Series([1,2,3,4],index=['a','b','c','d'])
df
Out[8]:
a 1
b 2
c 3
d 4
dtype: int64
df_new = df.reindex(['e','d','c','b','a'])
df_new
Out[10]:
e NaN
d 4.0
c 3.0
b 2.0
a 1.0
dtype: float64
上述重建索引时会出现缺失值NaN的情况,因此有时会需要对缺失值进行插值和填值,reindex()
方法中的method参数可以完成操作。
df = pd.Series(['a','b','c'],index=[1,3,5])
df
Out[12]:
1 a
3 b
5 c
dtype: object
# ffill将值向前填充
df.reindex(range(6),method='ffill')
Out[13]:
0 NaN
1 a
2 a
3 b
4 b
5 c
dtype: object
# bfill将值向后填充
df.reindex(range(6),method='bfill')
Out[14]:
0 a
1 a
2 b
3 b
4 c
5 c
dtype: object
reindex()
方法可以重建行索引、列索引,也可以同时改变两者。
当只传入一个序列的时候,只会对行进行重建索引。
df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['aaa','bbb','ccc'])
df
Out[18]:
aaa bbb ccc
a 0 1 2
b 3 4 5
c 6 7 8
df_1 = df.reindex(['a','b','c','d'])
df_1
Out[20]:
aaa bbb ccc
a 0.0 1.0 2.0
b 3.0 4.0 5.0
c 6.0 7.0 8.0
d NaN NaN NaN
对列重建索引可以通过使用columns
关键字完成。
df_2 = df.reindex(columns=['aaa','ccc','ddd'])
df_2
Out[22]:
aaa ccc ddd
a 0 2 NaN
b 3 5 NaN
c 6 8 NaN
.reindex()
的参数
参数 | 说明 |
---|---|
index,columns | 新的行列自定义索引 |
fill_value | 重新索引中,用于填充缺失位置的值 |
method | 填充方法,ffill当前值向前填充,bfill向后填充 |
limit | 最大填充量 |
copy | 默认True,生成新的对象,False时,新旧相等不复制 |
2.轴向上删除数据:
drop()
方法删除指定轴上的项。
df = pd.Series([1,2,3,4],index=['a','b','c','d'])
df
Out[3]:
a 1
b 2
c 3
d 4
dtype: int64
df_new = df.drop('b')
df_new
Out[5]:
a 1
c 3
d 4
dtype: int64
在DataFranme中,drop()
方法根据指定的轴删除相应的项。
df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['aaa','bbb','ccc'])
df
Out[9]:
aaa bbb ccc
a 0 1 2
b 3 4 5
c 6 7 8
df.drop('a')
Out[10]:
aaa bbb ccc
b 3 4 5
c 6 7 8
df.drop('aaa',axis=1)
Out[11]:
bbb ccc
a 1 2
b 4 5
c 7 8
drop()
方法直接操作原对象而不返回新对象。使用inplace
属性,会清楚被删除的数据。
df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['aaa','bbb','ccc'])
df
Out[14]:
aaa bbb ccc
a 0 1 2
b 3 4 5
c 6 7 8
df.drop('aaa',axis=1)
Out[15]:
bbb ccc
a 1 2
b 4 5
c 7 8
df
Out[16]:
aaa bbb ccc
a 0 1 2
b 3 4 5
c 6 7 8
df.drop('aaa',axis=1,inplace=True)
df
Out[18]:
bbb ccc
a 1 2
b 4 5
c 7 8
3.索引、选择、过滤:
- Series类型
Series的索引与Numpy数组类似,只不过Series的索引方式更多样。
import pandas as pd
obj = pd.Series([9,8,7,6],index=['a','b','c','d'])
obj
Out[9]:
a 9
b 8
c 7
d 6
dtype: int64
obj[2]
Out[3]: 7
obj['c']
Out[4]: 7
obj[0:2]
Out[5]:
a 9
b 8
dtype: int64
obj[['a','b']]
Out[6]:
a 9
b 8
dtype: int64
obj[[0,1]]
Out[7]:
a 9
b 8
dtype: int64
obj[obj>7]
Out[8]:
a 9
b 8
dtype: int64
使用索引直接赋值新的值,修改Series的相应部分。
obj['b':'c'] = 5
obj
Out[11]:
a 9
b 5
c 5
d 6
dtype: int64
- DataFrame类型
使用单个值或者多列,索引DataFrame中的一个或多列。
df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['aaa','bbb','ccc'])
df
Out[16]:
aaa bbb ccc
a 0 1 2
b 3 4 5
c 6 7 8
df['bbb']
Out[17]:
a 1
b 4
c 7
Name: bbb, dtype: int32
df[['aaa','bbb']]
Out[18]:
aaa bbb
a 0 1
b 3 4
c 6 7
也可以使用其他一些特殊索引方式。
可以根据一个布尔值数组切片选择数据。
# 行选择语法
df[:2]
Out[19]:
aaa bbb ccc
a 0 1 2
b 3 4 5
df[df['bbb']>4]
Out[20]:
aaa bbb ccc
c 6 7 8
另外还可以使用布尔值DataFrame进行索引。
df < 5
Out[21]:
aaa bbb ccc
a True True True
b True True False
c False False False
df[df<5] = 0
df
Out[23]:
aaa bbb ccc
a 0 0 0
b 0 0 5
- 使用
loc
和iloc
方法选择数据
loc
和iloc
方法允许使用轴标签loc
或整数标签iloc
以Numpy风格的语法从DataFrame中选择数据。
df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['aaa','bbb','ccc'])
df
Out[25]:
aaa bbb ccc
a 0 1 2
b 3 4 5
c 6 7 8
# 使用loc方法选择单行多列
df.loc['b',['aaa','ccc']]
Out[26]:
aaa 3
ccc 5
# 使用iloc方法选择单行多列
df.iloc[1,[0,2]]
Out[28]:
aaa 3
ccc 5
Name: b, dtype: int32
# 使用loc方法选择多行多列
df.loc[['b','c'],['aaa','ccc']]
Out[30]:
aaa ccc
b 3 5
c 6 8
# 使用iloc方法选择多行多列
df.iloc[[1,2],[0,2]]
Out[33]:
aaa ccc
b 3 5
c 6 8
除了单个标签或标签列表之外,索引功能还可以用于切片。
df
Out[34]:
aaa bbb ccc
a 0 1 2
b 3 4 5
c 6 7 8
df.loc[:'b','ccc']
Out[35]:
a 2
b 5
Name: ccc, dtype: int32
df.iloc[:,:2][df.bbb>3]
Out[36]:
aaa bbb
b 3 4
c 6 7
DataFrame的索引选项:
类型 | 说明 |
---|---|
df[val] | 从DataFrame中选择单列或列序列 |
df.loc[val] | 根据标签选择DataFrame的单行或多行 |
df.loc[:,val] | 根据标签选择DataFrame的单列或多列 |
df.loc[val1,val2] | 同时选择行和列中的一部分 |
df.iloc[where] | 根据整数位置选择单行或多行 |
df.iloc[:,where] | 根据整数位置选择单列或多列 |
df.iloc[where_i,where_j] | 根据整数位置选择行和列 |
df.at[label_i,label_j] | 根据行、列标签选择单个标量值 |
df.iat[i,j] | 根据行、列整数位置选择单个标量值 |
reindex方法 | 通过标签选择行或列 |
get_value,set_value方法 | 根据行和列的标签设置单个值 |
Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》