【问题标题】:Joining a DataFrame on itself to speed up iteration在自身上加入 DataFrame 以加速迭代
【发布时间】:2020-01-03 04:14:53
【问题描述】:

我正在处理一个数据项目,并且我正在尝试加快我的初始数据处理速度,因为我不可避免地想要对数据做一些其他/新的事情。到目前为止,我一直在尝试进行更多矢量化并使用 np.where 等。我已经看到了物质上的收益。

我需要处理的最后一段代码是最慢的。我正在使用 itterrows 在一个非常大的数据帧(>百万行)中循环。

我实际上想要做的是 SQL 等价于

select curr.value, prev.value from t1 left join t2 on curr.number = prev.number - 1

据我所知,没有办法像这样在自身上加入 DataFrame。是否有其他方法可以遍历它以比较当前值和以前的值?这是数据框当前的样子

df = 
[a b c
 3 1 0
 4 1 0
 5 1 0
 6 0 1]

请注意,b 从 1 变为 0,这就是我要捕获的内容,这样我现在将拥有一个看起来像这样的 df

[a b c b_c
 3 1 0  0
 4 1 0  0
 5 1 0  0
 6 0 1  1]

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 所以1-df['b']?对不起,如果我没有得到你,你能解释一下吗

标签: python pandas iteration


【解决方案1】:

我认为您正在寻找类似的东西。基本上你想知道从 b 到 c 的切换。

df = pd.DataFrame()
df["a"] = [3,4,5,6,7,8,9]
df["b"] = [1,1,1,0,0,1,1]
df["c"] = [0,0,0,1,1,0,0]

df["b_c"] = df["b"].eq(df["c"].shift()).astype(int)

print(df)

输出:

   a  b  c  b_c
0  3  1  0    0
1  4  1  0    0
2  5  1  0    0
3  6  0  1    1
4  7  0  1    0
5  8  1  0    1
6  9  1  0    0

我不确定这是否是最快的方法,或者它是否比使用 iterrows 更快,但我认为它是。 (至少看起来不错)

【讨论】:

  • Boendal,谢谢,这就是我一直在寻找的方法。欣赏它
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多