【Dataframe】基本操作

DataFrame 有些方法可以直接进行数据统计,矩阵计算之类的基本操作。

1 转置

直接字母 T,线性代数上线。

比如说把之前的 df3 转置一下。

>>> df3
  name  age gender
0   小明   17      男
1   小红   20      女
2   狗蛋    5      女
3   铁柱   40      男
>>> df3.T
         0   1   2   3
name    小明  小红  狗蛋  铁柱
age     17  20   5  40
gender   男   女   女   男
>>>

2 描述性统计

使用 describe 可以对数据根据列进行描述性统计。

比如说对 df1 进行描述性统计。

>>> df1
          A         B         C         D
A  1.534538 -0.457642 -0.177800 -0.721894
B -0.641673 -0.033828 -0.008813 -0.260790
C -0.058381 -0.492103  0.579269  0.476031
D -0.442216 -1.541925 -0.198197  0.946656
>>> df1.describe()
              A         B         C         D
count  4.000000  4.000000  4.000000  4.000000
mean   0.098067 -0.631374  0.048615  0.110001
std    0.987766  0.641806  0.363809  0.744649
min   -0.641673 -1.541925 -0.198197 -0.721894
25%   -0.492080 -0.754558 -0.182899 -0.376066
50%   -0.250299 -0.474872 -0.093307  0.107621
75%    0.339849 -0.351688  0.138207  0.593688
max    1.534538 -0.033828  0.579269  0.946656
>>>

如果有的列是非数值型的,那么就不会进行统计。

如果想对行进行描述性统计,可以转置后进行 describe

3 计算

使用 sum 默认对每列求和,sum(1) 为对每行求和。比如

>>> df3.sum()
name      小明小红狗蛋铁柱
age             82
gender        男女女男
dtype: object
>>>

可以发现就算元素是字符串,使用 sum 也会加起来。

>>> df3.sum(1)
0    17
1    20
2     5
3    40
dtype: int64
>>>

而一行中,有字符串有数值则只计算数值。

数乘运算使用 apply,比如。

>>> df2
   A  B  C  D
A  1  2  3  4
B  2  3  4  5
C  3  4  5  6
D  4  5  6  7
>>> df2.apply(lambda x: x * 2)
   A   B   C   D
A  2   4   6   8
B  4   6   8  10
C  6   8  10  12
D  8  10  12  14
>>>

如果元素是字符串,则会把字符串再重复一遍。

乘方运算跟 matlab 类似,直接使用两个 *,比如。

>>> df2 ** 2
    A   B   C   D
A   1   4   9  16
B   4   9  16  25
C   9  16  25  36
D  16  25  36  49
>>>

乘方运算如果有元素是字符串的话,就会报错。

4 新增

扩充列可以直接像字典一样,列名对应一个 list,但是注意 list 的长度要跟 index 的长度一致

>>> df2['E'] = ['999', '999', '999', '999']
>>> df2
   A  B  C  D    E
A  1  2  3  4  999
B  2  3  4  5  999
C  3  4  5  6  999
D  4  5  6  7  999
>>>

还可以使用 insert,使用这个方法可以指定把列插入到第几列,其他的列顺延。

>>> df2.insert(0, 'F', [888,888,888,888])
>>> df2
     F  A  B  C  D    E
A  888  1  2  3  4  999
B  888  2  3  4  5  999
C  888  3  4  5  6  999
D  888  4  5  6  7  999
>>>

5 合并

使用 join可以将两个 DataFrame 合并,但只根据行列名合并,并且以作用的那个 DataFrame 的为基准。如下所示,新的 df7 是以 df2 的行号 index 为基准的。

>>> df6 = pd.DataFrame(['my', 'name', 'is', 'a'], index=list('ACDH'), columns=list('G'))
>>> df6
      G
A    my
C  name
D    is
H     a
>>> df7 = df2.join(df6)
>>> df7
     F  A  B  C  D    E     G
A  888  1  2  3  4  999    my
B  888  2  3  4  5  999   NaN
C  888  3  4  5  6  999  name
D  888  4  5  6  7  999    is
>>>

join 这个方法还有how这个参数可以设置,合并两个 DataFrame 的交集或并集。参数为’inner‘表示交集,’outer’表示并集。

>>> df8 = df2.join(df6, how='inner')
>>> df8
     F  A  B  C  D    E     G
A  888  1  2  3  4  999    my
C  888  3  4  5  6  999  name
D  888  4  5  6  7  999    is
>>> df9 = df2.join(df6, how='outer')
>>> df9
       F    A    B    C    D    E     G
A  888.0  1.0  2.0  3.0  4.0  999    my
B  888.0  2.0  3.0  4.0  5.0  999   NaN
C  888.0  3.0  4.0  5.0  6.0  999  name
D  888.0  4.0  5.0  6.0  7.0  999    is
H    NaN  NaN  NaN  NaN  NaN  NaN     a
>>>

如果要合并多个 Dataframe,可以用 list 把几个 Dataframe 装起来,然后使用 concat转化为一个新的 Dataframe。

>>> df10 = pd.DataFrame([1,2,3,4], index=list('ABCD'), columns=['a'])
>>> df11 = pd.DataFrame([10,20,30,40], index=list('ABCD'), columns=['b'])
>>> df12 = pd.DataFrame([100,200,300,400], index=list('ABCD'), columns=['c'])
>>> list1 = [df10.T, df11.T, df12.T]
>>> df13 = pd.concat(list1)
>>> df13
     A    B    C    D
a    1    2    3    4
b   10   20   30   40
c  100  200  300  400
>>>