首页 > Pandas 阅读数:10

Pandas DataFrame对象行列操作

Pandas 的数据框可以看作是 Numpy 中的二维数组。

1. DataFrame对象行操作

1) loc与iloc区别注意

行操作与 Numpy 二维数组的方法类似,特别要注意的是 loc 和 iloc 的区别。示例代码如下。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c'],'c': ["A","B","C"]})
   ...: df
Out[2]: 
   a  b  c
0  1  a  A
1  2  b  B
2  3  c  C
In [3]: df.loc[1,:]  # 选择标签为1的行数据
Out[3]: 
a    2
b    b
c    B
Name: 1, dtype: object
In [4]: df.loc[1:2,:]  # 选择标签为1、2的行数据
Out[4]: 
   a  b  c
1  2  b  B 
2  3  c  C
In [5]: df.iloc[1:2,:]  # 注意当使用iloc时,只返回标签为1的行数据
Out[5]: 
   a  b  c
1  2  b  B

2)DataFrame对象倒序操作

这里的倒序方法和 Python 中自带的 list 的索引方法相同,可以设置起始点和终止点以及步长。Python 的特点就是可以将步长设为-1,这样就是倒序的索引了。
In [6]: df.loc[::-1,:]  # 选择所有行,步长为-1,所以为倒序
Out[6]: 
   a  b  c
2  3  c  C
1  2  b  B
0  1  a  A
In [7]: df.loc[0:2:2,:]  # 选择0至2行,步长为2
Out[7]: 
   a  b  c
0  1  a  A
2  3  c  C

3) 选择符合条件的值

我们经常在操作数据框的时候选择某些符合条件的值,在 DataFrame 中这样的操作可以简化为两个步骤。
  • 第一步:获得符合条件的元素的索引。
  • 第二步:使用该索引对数据框中的元素进行索引。
In [8]: select = df.loc[:,"a"] >= 2  # 条件筛选,选择"a"列中大于2的元素
   ...: df.loc[select,:]
Out[8]: 
   a  b  c
1  2  b  B
2  3  c  C

4) DataFrame对象增加行

我们可以通过直接赋值的方法来增加行。
In [9]: df.loc[3,:]=4  # 增加行
In [10]: df.loc[[1,2],:]=df.loc[[2,1],:].values  # 注意一定要带.values
    ...: df
Out[10]: 
     a  b  c 
0  1.0  a  A
1  3.0  c  C
2  2.0  b  B
3  4.0  4  4
In [11]: df.drop(0,axis=0,inplace=True)  # 删除行
    ...: df
Out[11]: 
     a  b  c
1  3.0  c  C
2  2.0  b  B
3  4.0  4  4

2. DataFrame对象列操作

DataFrame 对行的操作和对列的操作基本相同,不过要注意的是交换列的方法要使用 .values 来获取数值,否则会失败。示例代码如下。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c'],'c': ["A","B","C"]})
   ...: df
Out[2]: 
   a  b  c
0  1  a  A
1  2  b  B
2  3  c  C
In [3]: df.loc[:,"a"]  # 选择'a'列
Out[3]: 
0    1
1    2
2    3
Name: a, dtype: int64
In [4]: df.loc[:,"a":"b"]  # 选择多列
Out[4]: 
   a  b
0  1  a
1  2  b
2  3  c
In [5]: df.loc[:,"d"]=4  # 添加列
In [6]: df.loc[:,['b', 'a']] = df.loc[:,['a', 'b']].values  # 交换两列的值,注意一定
#使用.values
   ...: df
Out[6]: 
   a  b  c  d
0  a  1  A  4
1  b  2  B  4
2  c  3  C  4
In [7]: df.rename(columns={'b':'第二列'}, inplace=True)   # 替换指定的列名
   ...: df
Out[7]: 
   a  第二列  c  d
0  a    1  A  4
1  b    2  B  4 
1  b    2  B  4
2  c    3  C  4
In [8]: df.columns = df.columns.map(lambda x:x.upper()) # 全部大写
   ...: df
Out[8]: 
   A  第二列  C  D
0  a    1  A  4
1  b    2  B  4
2  c    3  C  4
In [9]: del df['A']  # 删除列
   ...: df
Out[9]: 
   第二列  C  D
0    1  A  4
1    2  B  4
2    3  C  4