Python 用唯一正整数填充数据帧

Python 用唯一正整数填充数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个像这样的数据框 col1 col2 col3 col4 col5 0 0 1 0 1 1 1 0 1 0 0 1 col1 col2 col3 col4 col5 0 2 1 3 1 1 1 4 1 5 6 1 我想为每个0条目分配一个大于1的唯一正整数 所以我想要一个像这样的数据帧 col1 col2

我有一个像这样的数据框

   col1 col2 col3  col4 col5  
 0   0   1    0     1     1
 1   0   1    0     0     1
      col1 col2  col3  col4 col5    
    0  2    1     3     1    1
    1  4    1     5     6    1
我想为每个0条目分配一个大于1的唯一正整数

所以我想要一个像这样的数据帧

   col1 col2 col3  col4 col5  
 0   0   1    0     1     1
 1   0   1    0     0     1
      col1 col2  col3  col4 col5    
    0  2    1     3     1    1
    1  4    1     5     6    1
整数不必来自有序序列,只需正数和唯一数。

我认为您可以使用生成唯一随机数,并用布尔掩码替换所有
0
,生成方法为
df==0

print df
   col1  col2  col3  col4  col5
0     0     1     0     1     1
1     0     1     0     0     1

print df == 0
   col1   col2  col3   col4   col5
0  True  False  True  False  False
1  True  False  True   True  False

print df.shape
(2, 5)

#count of integers
min_count = df.shape[0] * df.shape[1]
print min_count
10

#you need add 2, because omit 0 and 1
print np.arange(start=2, stop=min_count + 2).reshape(df.shape)
[[ 2  3  4  5  6]
 [ 7  8  9 10 11]]

#use integers from 2 to max count of values of df
df[ df == 0 ] = np.arange(start=2, stop=min_count + 2).reshape(df.shape)
print df
   col1  col2  col3  col4  col5
0     2     1     4     1     1
1     7     1     9    10     1
或用于更大的唯一随机整数:

#count of integers
min_count = df.shape[0] * df.shape[1]
print min_count
10
#you can use bigger number in np.arange, e.g. 100, but minimal is min_count + 2
df[ df == 0 ] = np.random.choice(np.arange(2, 100), replace=False, size=df.shape)
print df
   col1  col2  col3  col4  col5
0    17     1    53     1     1
1    39     1    15    76     1

这将起作用,尽管它不是熊猫中最棒的表演:

import random

MAX_INT = 100

for row in df:
    for col in row:
        if col == 0:
            col == random.randrange(1, MAX_INT)
类似于
itertuples()
的东西会更快,但如果数据不是很多,这就没问题了。

np.arange(…).reformate(df.shape)生成一个数据帧,该数据帧由从2开始的连续整数组成

df。其中(df,…)
起作用,因为您的数据帧由二进制指示符(0和1)组成。它保留所有真值(即1),然后使用连续numpy数组填充零

# optional: inplace=True
>>> df.where(df, np.arange(start=2, stop=df.shape[0] * df.shape[1] + 2).reshape(df.shape))  
   col1  col2  col3  col4  col5
0     2     1     4     1     1
1     7     1     9    10     1
这里已经有很多很好的答案了,但是把这个扔出去

  • replace
    指示样本是否有替换

  • np.arange
    来自(
    2
    df+2的大小)。它是
    2
    ,因为您希望它大于1

  • size
    必须与
    df
    的形状相同,所以我只使用了
    df.shape

  • 要说明
    np.random.choice
    生成的数组值:

    >>> np.random.choice(np.arange(2, df.size + 2), replace=False, size=df.shape)
    array([[11,  4,  6,  5,  9],
           [ 7,  8, 10,  3,  2]])
    
    请注意,它们都大于1,并且都是唯一的

    之前:

       col1  col2  col3  col4  col5
    0     0     1     0     1     1
    1     0     1     0     0     1
    
    之后:

       col1  col2  col3  col4  col5
    0     9     1     7     1     1
    1     6     1     3    11     1
    

    这并不能保证唯一性。你可以选择相同的随机数。@Alexander-你说得对。我编辑答案。非常感谢。