DataFrame基本操作 <二> 加,减,求和,lambda,索引排序(row,cols,非内容)

首先来一个别致的列表创建,我有印象但是从来没用过,突然发现很好用也很优雅

a=list('qwe13qaew')
print(a)

运行结果

['q', 'w', 'e', '1', '3', 'q', 'a', 'e', 'w']

 

实际应用也很有效果,生成两个实例用于练习

df3 = pd.DataFrame(np.arange(12).reshape((3, 4)),
                    index=['Qingdao', 'Jinan', 'Yantai'],
                    columns=list('abcd'))
df4 = pd.DataFrame(np.arange(20).reshape((4, 5)),
                    index=['Qingdao', 'Jinan', 'Yantai', 'Linyi'],
                    columns=list('abcde'))   #这种用法很别致啊直接
print(df3)

print(df4)

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11

          a   b   c   d   e
Qingdao   0   1   2   3   4
Jinan     5   6   7   8   9
Yantai   10  11  12  13  14
Linyi    15  16  17  18  19

加法运算

print(df3 + df4 )# 注意行列数不同的两个 DataFrame 相加行列的对齐和值填充。

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
          a   b   c   d   e
Qingdao   0   1   2   3   4
Jinan     5   6   7   8   9
Yantai   10  11  12  13  14
Linyi    15  16  17  18  19
#########################################
            a     b     c     d   e
Jinan     9.0  11.0  13.0  15.0 NaN
Linyi     NaN   NaN   NaN   NaN NaN
Qingdao   0.0   2.0   4.0   6.0 NaN
Yantai   18.0  20.0  22.0  24.0 NaN

相当牛逼,index跟‘name’相同的直接加,不存在的用缺省值定住。

填充后的加法运算

print(df3.add(df4, fill_value=0)) # 注意无效值用 0 填充后的加法运算

print(df3.add(df4, fill_value=100))

运行结果

            a     b     c     d     e
Jinan     9.0  11.0  13.0  15.0   9.0
Linyi    15.0  16.0  17.0  18.0  19.0
Qingdao   0.0   2.0   4.0   6.0   4.0
Yantai   18.0  20.0  22.0  24.0  14.0
             a      b      c      d      e
Jinan      9.0   11.0   13.0   15.0  109.0
Linyi    115.0  116.0  117.0  118.0  119.0
Qingdao    0.0    2.0    4.0    6.0  104.0
Yantai    18.0   20.0   22.0   24.0  114.0

减法运算

s3 = df3.iloc[0]
print(s3)
print(df3 - s3 ) # 减法缺省是按列对齐去减,并广播至每一行。

运行结果

a    0
b    1
c    2
d    3
Name: Qingdao, dtype: int32
         a  b  c  d
Qingdao  0  0  0  0
Jinan    4  4  4  4
Yantai   8  8  8  8

每一行都减去了0,1,2,3

对比一下

s4=[4,5,6,7]
print(df3 - s4) # 减法缺省是按列对齐去减,并广播至每一行。

运算结果

         a  b  c  d
Qingdao -4 -4 -4 -4
Jinan    0  0  0  0
Yantai   4  4  4  4

 

 下边这个也得慢慢理解

s3 = df3['b']
通过指定轴,按行对齐去减,并广播至每一列。
s3 = df3['b']
df3.sub(s3, axis=0) # 通过指定轴,按行对齐去减,并广播至每一列。

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
Qingdao    1
Jinan      5
Yantai     9
Name: b, dtype: int32
         a  b  c  d
Qingdao -1  0  1  2   #一行都减去1
Jinan   -1  0  1  2   #这一行都减去5
Yantai  -1  0  1  2   #这一行都减去9

求和

print(df3.sum()  )     # 按行对每一列求和
print(df3.sum(axis=1)) # 按列对每一行求和

#这里就要用到对axis的理解,axis为0是垂直方向,axis为1,就是水平方向,这里不能把0,1理解成行,列,应该理解成垂直与水平

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
#上边是dfs

a    12
b    15
c    18
d    21
dtype: int64
Qingdao     6
Jinan      22
Yantai     38
dtype: int64

lambda表达式处理语句

垂直方向的最大值-最小值

a=df3.apply(lambda x: x.max() - x.min()) # 按行对每一列自定义处理
print(a)

#这里的行其实就是垂直方向,axis=0的意思
#lambda表达式的意思是每一列(垂直方向就是列)的最大值减去最小值

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
a    8     #8-0
b    8     #9-1
c    8     #10-2
d    8     #11-3
dtype: int64

水平方向的最大值减去最小值

a=df3.apply((lambda x: x.max() - x.min()), axis=1) # 按列对每一行自定义处理
print(a)

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
Qingdao    3
Jinan      3
Yantai     3
dtype: int64
对每一个单元应用一个处理
a=df3.applymap(lambda x: '%.2f' % x) # 对每一个单元应用一个处理
print(a)

#转化成显示2位小数的浮点类型。这个我不会写,但是先记住用法,以后回来查

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
            a     b      c      d
Qingdao  0.00  1.00   2.00   3.00
Jinan    4.00  5.00   6.00   7.00
Yantai   8.00  9.00  10.00  11.00
索引排序
按行索引排序 (垂直方向,index)
a=df3.sort_index() # 按行索引排序
print(a)

#df.sort_index()就是按照垂直方向排序,A-Z的顺序排,j-q-y的顺序

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
         a  b   c   d
Jinan    4  5   6   7
Qingdao  0  1   2   3
Yantai   8  9  10  11
按列索引倒序排序(水平倒叙排序)
a=df3.sort_index(axis=1, ascending=False) # 按列索引倒序排序
print(a)

#这个ascending我得记一下,算了,我遍布下去了,反正记住就行了,ascending=False可以显示出来结果,不加的话,还显示原来的dfs

#可以理解成ps一层一层的,df3的优先级是最高的,这里ascending=false 把df3的优先级给降下去了。先这么理解吧,不对的话以后再改

运行结果

         a  b   c   d
Qingdao  0  1   2   3
Jinan    4  5   6   7
Yantai   8  9  10  11
          d   c  b  a
Qingdao   3   2  1  0
Jinan     7   6  5  4
Yantai   11  10  9  8

 

这些先到这里

 
 
 
 
posted @ 2018-06-06 00:05  人无远虑  阅读(646)  评论(0编辑  收藏  举报