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数据运算的主要内容,如果未能解决你的问题,请参考以下文章