如何在Python的数据框中将0替换为随机整数?

3

你好,新年快乐 :)

我有一个SQLite3数据库,其中ID是主键,如果添加具有相同ID号的新行,则会替换具有新数据的行。但是生成CSV文件的程序在目标为空时会将ID放入0中。 问题在于,如果有几行具有ID 0,则只会有一行存在于数据库中,因为如果有多个ID,则会替换它们。当我从数据库查询数据时,这会在我的应用程序中造成问题,因为我必须具有相同编号的继电器的两个目标,1和2。 我想做的是将所有ID为0的ID转换为介于1000和2000之间的随机整数,并且不能生成两次该随机数字。

我尝试过 df.loc[df['ID'] == 0,'ID'] = df['ID'].apply(lambda x: np.random.normal(0,1)) df,但这只会生成一个随机浮点数,我无法使用它。

如何解决这个问题?感谢你们提前的回答 :)

    LeonID Relay Target ... Klasse Fyll   ID
0        2    1      1  ...      3    0  210
1        2    1      2  ...    NaN    0    0
2        2    2      1  ...    V55    0  208
3        2    2      2  ...      2    0  211
4        2    3      1  ...    V55    0  209
5        2    3      2  ...    KIK    0  226
6        2    4      1  ...      4    0  218
7        2    4      2  ...      4    0  212
8        2    5      1  ...    NaN    0    0
9        2    5      2  ...      2    0  220
10       2    6      1  ...      2    0  213
11       2    6      2  ...      2    0  225
12       2    7      1  ...     EJ    0  219
13       2    7      2  ...      2    0  224
14       2    8      1  ...      2    0  221
15       2    8      2  ...      1    0  206
16       2    9      1  ...    NaN    0    0
17       2    9      2  ...      4    0  216
18       2   10      1  ...      2    0  214
19       2   10      2  ...      R    0  236
20       2   11      1  ...      4    0  215
21       2   11      2  ...      4    0  217
22       2   12      1  ...      4    0  207
23       2   12      2  ...     EJ    0  205
24       2   13      1  ...      4    0  222
25       2   13      2  ...      2    0  223

所以,我猜这是一个关于pandas的问题,因为你的数据存储在一个pandas dataframe df中?如果是真的,请添加pandas标签。 - Mr. T
这个回答解决了你的问题吗?用随机数替换Pandas数据框中的唯一值 - Hector Haffenden
嗨,谢谢你。它按照预期工作了。但是我没有想到会出现一个问题。现在它会在一个继电器中产生几个目标,其中包括1或2。它应该只有一个目标1和目标2。 - Tor Harry
有没有什么简单的方法,例如如果ID为0,继电器为2,目标为1,则将det ID转换为21或类似的内容?这样就可以解决我的问题了 :) - Tor Harry
2个回答

1
创建一个数值范围在1000-2000之间的系列,然后调用它的sample方法即可得到所需结果。请注意,sample方法有一个关键字参数replace,默认为False(不允许重复抽取同一行)。
mask = df['ID'] == 0
df.loc[mask,'ID'] = pd.Series(range(1000,2000)).sample(mask.sum()).values

1
有没有更简便的方法,比如如果ID是0,继电器是2,目标是1,它会将det ID转换为21之类的东西?这可以解决我的问题 :)
df.loc[df['ID'] == 0, 'ID'] = \
    df[['Relay', 'Target']].astype(str).apply(''.join, axis=1).astype(int)
print(df)

# Output
    LeonID  Relay  Target  ... Klasse  Fyll   ID
0        2      1       1  ...      3     0  210
1        2      1       2  ...    NaN     0   12  # HERE
2        2      2       1  ...    V55     0  208
3        2      2       2  ...      2     0  211
4        2      3       1  ...    V55     0  209
5        2      3       2  ...    KIK     0  226
6        2      4       1  ...      4     0  218
7        2      4       2  ...      4     0  212
8        2      5       1  ...    NaN     0   51  # HERE
9        2      5       2  ...      2     0  220
10       2      6       1  ...      2     0  213
11       2      6       2  ...      2     0  225
12       2      7       1  ...     EJ     0  219
13       2      7       2  ...      2     0  224
14       2      8       1  ...      2     0  221
15       2      8       2  ...      1     0  206
16       2      9       1  ...    NaN     0   91  # HERE
17       2      9       2  ...      4     0  216
18       2     10       1  ...      2     0  214
19       2     10       2  ...      R     0  236
20       2     11       1  ...      4     0  215
21       2     11       2  ...      4     0  217
22       2     12       1  ...      4     0  207
23       2     12       2  ...     EJ     0  205
24       2     13       1  ...      4     0  222
25       2     13       2  ...      2     0  223

@TorHarry。它解决了你的问题吗? - Corralien
这解决了我的问题:) 非常感谢你 :) - Tor Harry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接