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-你说得对。我编辑答案。非常感谢。