有条件地替换为熊猫

时间:2019-12-20 00:15:38

标签: python pandas

我有一个这样的熊猫df:

ID VAL
1  4
2  2
3  1
1  4
2  3
3  3

我想要的是,如果ID大于或等于ID3,那么ID3应该是5到6之间的随机值。所以我会得到类似以下结果:

ID VAL
1  4
2  2
3  5
1  4
2  3
3  6

df实际上有6000行,所以我想提出一种迭代和解决(如果需要)的方法。

谢谢!

3 个答案:

答案 0 :(得分:0)

如评论中所述,您只想更改ID = 3,其中VAL小于ID = 2的VAL。您只需使用diff

即可使用另一个掩码来检查ID = 3小于ID = 2
m = df.ID.eq(3)
m1 = df.VAL.diff().le(0)
df.loc[m & m1, 'VAL'] = np.random.choice([5, 6], size=(m & m1).sum())

Out[549]:
   ID  VAL
0   1    4
1   2    2
2   3    6
3   1    4
4   2    3
5   3    5

如果您不想重复值,请指定选项replace=False

m = df.ID.eq(3)
m1 = df.VAL.diff().le(0)
df.loc[m & m1, 'VAL'] = np.random.choice([5, 6], size=(m & m1).sum(), replace=False)

答案 1 :(得分:0)

IIUC:

import random
what = (df['ID'] ==3 ) & ((df['VAL'] <= df['VAL'].shift()))
df['new_col'] = what
df.loc[df['new_col'] == True, 'VAL'] = random.randint(5,6) 
   ID  VAL  new_col
0   1    4    False
1   2    2    False
2   3    6     True
3   1    4    False
4   2    3    False
5   3    6     True

您可以删除new_col

答案 2 :(得分:0)

这将使用5到6之间的随机选择替换ID大于或等于3的VAL

import pandas as pd
import numpy as np
import random


sample_data = pd.DataFrame({'ID': [1, 2, 3, 1, 2, 3],
                            'VAL': [4, 2, 1, 4, 3, 3]})

# To generate the same pseudo random numbers
random.seed(51)

sample_data['VAL'] = np.where(sample_data['ID']>=3, random.choice([5, 6]), sample_data['VAL'])