Pandas行间计算替代循环方法及Numpy二维数组转换问询
嘿,我来帮你把这段循环代码改成更高效的Pandas原生写法,同时解决Numpy数组转换的问题~
Pandas原生实现行间计算
Pandas有专门的行间计算方法,完全可以替代你写的for循环,代码更简洁且性能更好:
1. 计算diffs列(当前x与前一行x的差值)
Pandas的diff()方法就是专门用来计算相邻行的差值的,默认是当前行减前一行,还会自动为第一行填充NaN,完美匹配你的需求:
my_df['diffs'] = my_df['x'].diff()
2. 计算ratios列(判断前一行y是否≥1.5倍当前y)
这里可以用shift()方法把y列向下偏移一行,得到前一行的y值,然后直接做布尔比较,最后用fillna(False)把第一行的NaN转为False:
my_df['ratios'] = (my_df['y'].shift(1) >= 1.5 * my_df['y']).fillna(False)
完整Pandas代码
import pandas as pd import numpy as np np.random.seed(100) my_df = pd.DataFrame(np.random.randint(10, size=(6,4))) my_df.columns=['A', 'x', 'B','y'] my_df.index=[10,30,40,20,60,50] # 原生方法生成diffs列 my_df['diffs'] = my_df['x'].diff() # 原生方法生成ratios列 my_df['ratios'] = (my_df['y'].shift(1) >= 1.5 * my_df['y']).fillna(False) print(my_df)
运行后得到的结果和你用循环生成的完全一致,而且代码更易读、效率更高。
用Numpy转换为目标二维数组
你想要把x、y列转换成[[8,7],[0,2],[2,2],[0,4],[9,2],[1,3]]这样的二维数组,有两种简单的方法:
方法1:直接提取DataFrame的values属性
先选择x和y两列,然后调用values就能得到Numpy二维数组:
xy_array = my_df[['x', 'y']].values
方法2:用Numpy的column_stack函数
把x和y列的Numpy数组按列堆叠起来:
xy_array = np.column_stack([my_df['x'], my_df['y']])
验证结果
打印xy_array会得到:
array([[8, 7], [0, 2], [2, 2], [0, 4], [9, 2], [1, 3]])
完全符合你的需求。
内容的提问来源于stack exchange,提问作者Newbielp
相关产品推荐
相关产品推荐

