Python 根据条件从当前行和上一行中的值创建列表

Python 根据条件从当前行和上一行中的值创建列表,python,pandas,Python,Pandas,我有一个数据框,它有两列“a”和“b”,其中“b”是“a”的值和之前的值“a”之间的差值 df = pd.DataFrame({'a': [10, 60, 30, 80, 10]}) df['b'] = df['a']-df['a'].shift(1) a b 0 10 NaN 1 60 50.0 2 30 -30.0 3 80 50.0 4 10 -70.0 我想创建一个新的列“c”,其中的值作为“a”的先前值和“a”的当前值的列表(例如,[60,

我有一个数据框,它有两列“a”和“b”,其中“b”是“a”的值和之前的值“a”之间的差值

df = pd.DataFrame({'a': [10, 60, 30, 80, 10]})
df['b'] = df['a']-df['a'].shift(1)

    a   b
0   10  NaN
1   60  50.0
2   30  -30.0
3   80  50.0
4   10  -70.0
我想创建一个新的列“c”,其中的值作为“a”的先前值和“a”的当前值的列表(例如,[60,30]),仅当列“b”为负值时。否则,它必须是当前值“a”本身的列表

结果输出应该如下所示

    a   b       c
0   10  NaN     [10]
1   60  50.0    [60]
2   30  -30.0   [60, 30]
3   80  50.0    [80]
4   10  -70.0   [80, 10]

使用列表理解功能在numpy数组中创建列表,通过以下方式添加移位的辅助列
s


通过添加新轴使用并增加维度,然后使用布尔索引并指定新值:

df['c'] = df['a'].to_numpy()[:, None].tolist()
df.loc[df['b'].lt(0), 'c'] = df['c'].shift() + df['c']
结果:

   a     b         c
0  10   NaN      [10]
1  60  50.0      [60]
2  30 -30.0  [60, 30]
3  80  50.0      [80]
4  10 -70.0  [80, 10]
加载数据:

df = pd.DataFrame({'a': [10, 60, 30, 80, 10]})
df['b'] = df['a']-df['a'].shift(1)
创建临时Numpy矩阵:

npa = np.array([df['a'].shift(1), df['a']]).transpose()
将矩阵写入新的df列“c”:

df['c'] = list(npa)
如果列“b”中的值大于0或NAN,则将“a”中的值复制到“c”:

df.loc[(df['b'] > 0) | (df['b'].isnull() == True) , 'c'] = pd.Series([[x] for x in df['a']])

这些解决方案对你有效吗?是的,下面的解决方案很有效。别忘了给你投票或其他反馈,这对社区有帮助。
npa = np.array([df['a'].shift(1), df['a']]).transpose()
df['c'] = list(npa)
df.loc[(df['b'] > 0) | (df['b'].isnull() == True) , 'c'] = pd.Series([[x] for x in df['a']])