【发布时间】:2022-01-01 00:18:36
【问题描述】:
假设有一个这样的数据框
A
0 -1
1 -1
2 1
3 0
4 -2
5 3
6 0
我想在 A 列的值为负数的每一行中添加一个具有增量值的新列。
A B
0 -1 1
1 -1 2
2 1 nan
3 0 nan
4 -2 3
5 3 nan
6 0 nan
这是我的代码
ids = iter(range(1, np.sum((df['A'] < 0).values.ravel()) + 1))
df['B'] = np.where(df['A'] < 0, next(ids), np.nan)
不幸的是我得到的是
A B
0 -1 1
1 -1 1
2 1 nan
3 0 nan
4 -2 1
5 3 nan
6 0 nan
我也尝试过使用生成器
def id_generator(max_id):
curr = 1
while curr <= max_id:
yield curr
curr += 1
df['B'] = np.where(df['A'] < 0, next(id_generator(np.sum((df['A'] < 0).values.ravel()))), np.nan)
作为之前的解决方案,我得到了这个数据框
A B
0 -1 1
1 -1 1
2 1 nan
3 0 nan
4 -2 1
5 3 nan
6 0 nan
它似乎为它处理的每一行创建了一个迭代器/生成器,因此 id 始终为1。
我发现的唯一一种解决方案是使用中间数据帧
index = df[df['A'] < 0].index
new_df = pd.DataFrame(data=[x + 1 for x in range(len(index))], columns=['B'], index=index)
df = df.join(new_df)
所以我的问题是,有没有办法坚持使用np.where 解决方案而不是创建一个新的临时数据框?或者是否有任何pandas bultin 函数可以这样做?
【问题讨论】:
标签: python python-3.x pandas dataframe