添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
本文介绍了Pandas库中用于数据处理的几个关键函数:diff()、shift()和cumsum()。diff()函数计算差分,shift()函数实现数据移动,cumsum()函数计算累积和。在实际应用中,这些函数被用于计算体积公式、累计变化等复杂计算。通过示例代码展示了如何处理数据并解决运算过程中遇到的问题,如类型转换错误。同时,文章提供了使用DataFrame.eval()函数进行表达式计算的方法。 摘要生成于 ,由 DeepSeek-R1 满血版支持,

1. diff()函数 df['1].diff()
结果第一个结果为NAN。

2.shift()函数: df['1'].shift(-1) - df['1'] 代表下一行减去上一行。 结果最后一行值为NAN。

  • pandas DataFrame.shift()函数可以把数据移动指定的位数。
  • period参数指定移动的步幅,可以为正为负.axis指定移动的轴,1为行,0为列.
Series.shift(periods=1, freq=None, axis=0, fill_value=None)

shift()函数:默认向下(axis=0)向右移动(axis=1)。
如果想要向上向左移动,需要设置参数periods=-1,即向上移动:data.shift(periods=-1, axis=0)
向左移动:data.shift(periods=-1, axis=1)

3.pandas对单列、多列进行计算
对多列进行公式计算:
https://blog.csdn.net/zwhooo/article/details/79696558

4.python中上下行、列之间运算

改行与上一行做运算:

df['B'] = math.sqrt(df['A'] * df['A'].shift(periods=-1, axis=0))

报错:
在这里插入图片描述
解决办法:https://stackoverflow.com/questions/42988348/typeerror-cannot-convert-the-series-to-class-float

代码修改为:

df["B"] = (df["A"] * df["A"].shift(periods=-1, axis=0)).apply(lambda x: math.sqrt(x))  

5.计算累计和
cumsum()函数:求前n个元素的累积值

df["B"] = df['A'].cumsum(axis=0) #按行计算

更新:20220320
实际应用:计算体积ws = 1/3 * (h2-h1)/1000 *(a1+a2+sqart(a1*a2))
代码:

df = pd.read_excel('./424.xlsx')
#wl_change_2010-1
df["wl_change_2010-1"] = df['WL_change_month'].cumsum(axis=0) #by row
#h2 - h1 = df['WL_change_month']/1000
#ws_change_month
m = (df["predictions_area"] * df["predictions_area"].shift(periods=-1, axis=0)).apply(lambda x: math.sqrt(x))
df['m1'] = m.shift() #sqart(a1*a2)
n = df["predictions_area"] + df["predictions_area"].shift(periods=-1, axis=0)
df['n1'] = n.shift() #sum(a1+a2)
df.eval('ws_change_month = (WL_change_month/1000/3) * (m1 + n1)' , inplace=True)
df['ws_change_month'].fillna(0,inplace=True)
#ws_change_2010-1
df["ws_change_2010-1"] = df['ws_change_month'].cumsum(axis=0) #by row
df['ws_change_2010-1'].fillna(0,inplace=True)
#export data
df_new = pd.DataFrame(df,columns=['ID','Date','YearMonth','WL','Area','predictions_area',
                                  'WL_change_month','wl_change_2010-1',
                                  'ws_change_month','ws_change_2010-1'])
df_new.to_excel(r'./2calculate_ws/424.xlsx',index = False)

更新20220321:
df.eval函数:

Pandas dataframe.eval()函数用于在调用 DataFrame 实例的上下文中评估表达式。该表达式在 DataFrame 的列上求值。

DataFrame.eval(expr, inplace=False, **kwargs)
  • expr:要计算的表达式字符串。
  • inplace:如果表达式包含一个赋值,则是否就地执行操作并更改现有的DataFrame。否则,新
    返回DataFrame。
  • 返回:ret:ndarray,标量或pandas对象。
# importing pandas as pd 
import pandas as pd 
# Creating the dataframe  
df=pd.DataFrame({"A":[1,5,7,8], 
                 "B":[5,8,4,3], 
                 "C":[10,4,9,3]}) 
# To evaluate the sum over all the columns 
df.eval('D = A + B+C', inplace = True)

参考资料:https://vimsky.com/examples/usage/python-pandas-dataframe-eval.html

有时候我们需要判断相邻两行关系,比如想去除掉相邻两行某个字段相同的数据行。 比如我们可以写一个循环,判断每一行与上一行的关系 但是pandas已经有了现成的函数供我们使用 diff函数 pandas.Series.diff Calculates the difference of a Series element compared with another element in the Ser...
name = ['bob', 'mike','lisa','jay','alen','book','james'] month_sale = [100, 99, 120, 160, 50,70, 90] day_sale = [120, 99, 100, 260, 50,50, 190] df = pd.DataFrame(data={'name':name,'month_sale':mon
项目中数据处理过程中遇到的场景如下:一个系统下面有多个设备的运行数据,运行数据中有开关机状态的字段,需要统计在一个周期内,这些设备的开关机变化情况。 import pandas as pd # 1表示开机,0表示关机 df = pd.DataFrame({ 1: [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1], 2: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], 3: [1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
选择行的最快的方法不是遍历行。而是,创建一个mask(即,布尔数组),然后调用df[mask]选择。 这里有一个问题:如何动态表示dataframe中的当行、一行?答案是用shift。 shift(0):当行 shift(1):一行 shift(n):往第n行 若要满足多个条件 逻辑与&: mask = ((...) & (...)) 逻辑或|: mask =
如下数据为销售人员一季度销售业绩,求出每位销售人员每月与平均销售业绩的差 data=[[580,524,457,475,384,568,654,683,882,528], [1043,326,1056,543,797,1085,637,975,268,525], [880,963,908,528,366,671,327,316,213,653]] df = pd.DataFrame(columns=['禹迎南','崇清芬','于安宜','柳旷','革忻欢','区暮','焦元绿',
首先说一下需求,有一组数据需要取出后几列数据,并且将以一列数据进行移位运算,即(第二个数据-第一个数据)/第一个数据,(第三个数据-第二个数据)/第二个数据,以此类推。 以下为数据集的样子,共3338行,1151列,我只要用到最后五列。 0 1 2 ... count 10 01 0 6525.3...
from pyspark import SparkContext from pyspark.sql import SQLContext from pyspark.sql import functions as F from pyspark.sql.window import Window sc = SparkContext(appName="PrevRowDiffApp") sqlc = SQLContext...