本文介绍了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')
df["wl_change_2010-1"] = df['WL_change_month'].cumsum(axis=0)
m = (df["predictions_area"] * df["predictions_area"].shift(periods=-1, axis=0)).apply(lambda x: math.sqrt(x))
df['m1'] = m.shift()
n = df["predictions_area"] + df["predictions_area"].shift(periods=-1, axis=0)
df['n1'] = n.shift()
df.eval('ws_change_month = (WL_change_month/1000/3) * (m1 + n1)' , inplace=True)
df['ws_change_month'].fillna(0,inplace=True)
df["ws_change_2010-1"] = df['ws_change_month'].cumsum(axis=0)
df['ws_change_2010-1'].fillna(0,inplace=True)
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对象。
import pandas as pd
df=pd.DataFrame({"A":[1,5,7,8],
"B":[5,8,4,3],
"C":[10,4,9,3]})
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...