Python3 DataFrame数据运算

Posted 古月书斋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 DataFrame数据运算相关的知识,希望对你有一定的参考价值。

pandas的DataFrame极大地简化了数据分析过程中一些烦琐操作,它是一个表格型的数据结构, 每一列代表一个变量,而每一行则是一条记录。简答地说,DataFrame是共享同一个index的Series的集合。

一、简单运算

在分析数据时:不可避免地要对数据进行运算。当对两个数据集进行算术运算时,遇到的核心问题有两个:一是两个数据集之间如何进行匹配进而运算;二是如何处理不匹配的数据。Pandas的Series与DataFrame这两种数据类型比较有特色的部分是index ( DataFrame 还多了列名columns) 。因此,两个数据集最直接的匹配方式是按照index与columns进行 配运算。

Series 与Series之间运算是按照index匹配运算,无法匹配的则用NaN进行填充。

import pandas as pd
import numpy as np

S1=pd.Series([1,2,3], index=['A','B','C'])

S2=pd.Series([4,5,6], index=['B','C','D'])

S1+S2
Out[150]: 
A    NaN
B    6.0
C    8.0
D    NaN
dtype: float64

Series与DataFrame之间运算是按照Series的index与DataFrame的columns之间匹配。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(1,13).reshape(3,4),index=list("abc"),columns=list('ABCD'))
S1=pd.Series([1,2,3], index=['A','B','C'])

df+S1
Out[151]: 
      A     B     C   D
a   2.0   4.0   6.0 NaN
b   6.0   8.0  10.0 NaN
c  10.0  12.0  14.0 NaN

DataFrame与DataFrame之间是同时按照index与columns进行匹配,匹配成功的元素进行运算,无法匹配的用NaN填充。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(1,13).reshape(3,4),index=list("abc"),columns=list('ABCD'))

df
Out[135]: 
   A   B   C   D
a  1   2   3   4
b  5   6   7   8
c  9  10  11  12

df2 = pd.DataFrame(np.arange(1,13).reshape(4,3),index=list("bcef"),columns=list('CDE'))

df2
Out[142]: 
    C   D   E
b   1   2   3
c   4   5   6
e   7   8   9
f  10  11  12

df+df2
Out[143]: 
    A   B     C     D   E
a NaN NaN   NaN   NaN NaN
b NaN NaN   8.0  10.0 NaN
c NaN NaN  15.0  17.0 NaN
e NaN NaN   NaN   NaN NaN
f NaN NaN   NaN   NaN NaN

填充无法匹配部分也可以换成其他值,不过这就需要用调用函数的方式:

df.div(df2, fill_value=0)
Out[154]: 
     A    B     C    D    E
a  inf  inf   inf  inf  NaN
b  inf  inf  7.00  4.0  0.0
c  inf  inf  2.75  2.4  0.0
e  NaN  NaN  0.00  0.0  0.0
f  NaN  NaN  0.00  0.0  0.0

这里两个DataFrame数据df和df2都没有值的位置依旧用NaN填充,但df有值, 另一个df2没有值的地方,就用df相应的值与fll_vahie计算,这里返回的结果中inf 与0的元素就是这样得到的。

二、函数应用和映射

DataFrame是二维的数据集,有时我们需要对数据集的行与列进行函数操作,比如手边的数据是所有股票的一整年的月报酬率,我们想要找到每个月收益率最高的股票,或是 找出每只股票最高的收益率落在几月。当然可以逐行或者逐列地对该数据集进行分析,但是Pandas包里有更为简便的解决方式——调用apply()函数。该函数基本形式为:

dates=pd.date_range(start='2022-01-01', periods=6)

df1=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list("ABCD"))

df1.apply(max,axis=0)
Out[159]: 
A    1.210036
B    1.199999
C    0.648738
D    0.649709

df1.apply(max,axis=1)
Out[160]: 
2022-01-01    0.490815
2022-01-02    0.787797
2022-01-03    0.784778
2022-01-04    1.210036
2022-01-05    1.199999
2022-01-06    1.179677

f=lambda x:x.max()-x.min()

df1.apply(f,axis=1)
Out[162]: 
2022-01-01    1.464446
2022-01-02    1.882658
2022-01-03    1.721781
2022-01-04    2.667651
2022-01-05    2.293654
2022-01-06    0.827492

结束

以上是关于Python3 DataFrame数据运算的主要内容,如果未能解决你的问题,请参考以下文章

Python3 DataFrame缺失值的处理

Python3 DataFrame缺失值的处理

带有 OR 运算符的 DataFrame UserWarning [重复]

Python3 DataFrame数据详解

Python3 DataFrame数据详解

Python3 DataFrame数据排序与排名