Python 根据条件从当前行和上一行中的值创建列表
我有一个数据框,它有两列“a”和“b”,其中“b”是“a”的值和之前的值“a”之间的差值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,
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']])