【问题标题】:Pandas: Shift one column by other column value熊猫:将一列移动另一列值
【发布时间】:2017-07-11 00:50:20
【问题描述】:

我正在尝试使用一列的值将另一列的值移动该数量。根据文档,Pandas shift() 采用整数,但有没有办法改用系列?

当前代码:

import pandas as pd

df = pd.DataFrame({ 'a':[1,2,3,4,5,6,7,8,9,10],
                    'b':[0,0,0,0,4,4,4,0,0,0]})

df['a'] = df['a'].shift(df['b'])

...这当然行不通。

期望的输出:

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

如果它更容易,移位将始终相同,因此理论上'b' 系列可以是True / False 或其他一些二进制触发器,而.shift() 仍然可以是整数。走这条路感觉有点笨拙,但它会完成工作。

【问题讨论】:

  • 它给你回溯了吗?或者当前的输出是多少?
  • @Adam,当前回溯:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 我真的没想到它会起作用,我的代码更具说明性。我正在玩.loc[]df.index,但仍然没有取得进展。
  • shift 只是将列中的所有值移动给定的时间段而不是选择的数量。 stackoverflow.com/questions/10982089/…
  • @Adam - 我不确定如何处理该评论。我想你明白我想要达到的目标。其实我不需要使用.shift(),只需要得到想要的输出即可。
  • 我想我知道我只是想弄清楚如何措辞。大声笑

标签: python pandas shift


【解决方案1】:

我们可以使用numba solution:

from numba import jit

@jit
def dyn_shift(s, step):
    assert len(s) == len(step), "[s] and [step] should have the same length"
    assert isinstance(s, np.ndarray), "[s] should have [numpy.ndarray] dtype"
    assert isinstance(step, np.ndarray), "[step] should have [numpy.ndarray] dtype"
    N = len(s)
    res = np.empty(N, dtype=s.dtype)
    for i in range(N):
        res[i] = s[i-step[i]]
    return res

结果:

In [302]: df['new'] = dyn_shift(df['a'].values, df['b'].values)
# NOTE: we should pass Numpy arrays:   ^^^^^^^         ^^^^^^^

In [303]: df
Out[303]:
    a  b  new
0   1  0    1
1   2  0    2
2   3  0    3
3   4  0    4
4   5  4    1
5   6  4    2
6   7  4    3
7   8  0    8
8   9  0    9
9  10  0   10

【讨论】:

  • 我毫不怀疑这是一个很好的答案,但现在我需要进入numba 兔子洞!你能解释一下numbajit 是做什么的吗?我完全陌生。谢谢。
  • @pshep123,我想我不能比Pandas documentation does 解释得更好;-)
【解决方案2】:

想通了:

df.loc[df['b'] == 4, 'a'] = df['a'].shift(4)

...这是我上面提到的“hacky”版本。第一个 4 实际上只是一个触发器,而第二个 4 将是硬编码的。

【讨论】:

  • 但是如果列b 是可变的呢?考虑到班次按行号优先;即第一行在发生冲突时具有最高优先级,并且需要替换另一行。
  • @tiba - 你是对的。如果它不仅仅是二进制,这将不是解决方案。但是,根据我的原始帖子,此解决方案符合我的需求。也就是说,如果您有处理 'b' 中的变量的解决方案,那么请务必发帖,我会接受。
  • @pshep123 如果您在a 中有字符串,并且您尝试移动,比如说1。会发生什么?现在,移动 4。会发生什么?在这两种情况下它们都是 NaN 吗?其他行是否会受到a 移动量的影响?
  • @COLDSPEED - 如果班次超出索引,则只有NaNs。如果不是,它会被简单地替换,因此,如果 shift 列是 [0,1],为了简化 ['apple','banana'] 将变为 ['apple','apple']
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 2018-11-04
  • 1970-01-01
  • 2020-11-26
  • 2018-02-18
  • 2020-12-11
  • 2021-08-30
  • 2017-04-14
相关资源
最近更新 更多