我有一个这样的熊猫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行,所以我想提出一种迭代和解决(如果需要)的方法。
谢谢!
答案 0 :(得分:0)
如评论中所述,您只想更改ID = 3,其中VAL
小于ID = 2的VAL
。您只需使用diff
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'])