首页Python7.Pandas基本操作(...

7.Pandas基本操作(1)

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
  • 使用lociloc方法选择数据

lociloc方法允许使用轴标签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》

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments