在熊猫数据框中随机插入NA的值 - 没有完全丢失的行

时间:2017-02-07 13:23:55

标签: python pandas missing-data

如何在熊猫数据框中随机创建一些值,如Randomly insert NA's values in a pandas dataframe ,但确保没有完全设置缺少值的行?

编辑:很抱歉没有明确说明这一点(这是我引用的问题):我需要能够指定单元格应该是NaN(或者更确切地说,与现有数据框的大小相同,接近10%),而不是单独清除单元格每单元边际概率为10%。

3 个答案:

答案 0 :(得分:4)

您可以使用DataFrame.masknumpy boolean mask使用answer of this my question

df = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6],
                   'C':[7,8,9]})

print (df)
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

np.random.seed(100)
mask = np.random.choice([True, False], size=df.shape)
print (mask)
[[ True  True False]
 [False False False]
 [ True  True  True]] -> problematic values - all True

mask[mask.all(1),-1] = 0
print (mask)
[[ True  True False]
 [False False False]
 [ True  True False]]

print (df.mask(mask))
     A    B  C
0  NaN  NaN  7
1  2.0  5.0  8
2  NaN  NaN  9

答案 1 :(得分:1)

如何应用将替换随机列值的函数。为避免替换整行,可以绘制0到n-1之间的数字来替换。

import random

def add_random_na(row):
    vals = row.values
    for _ in range(random.randint(0,len(vals)-2)):
        i = random.randint(0,len(vals)-1)
        vals[i] = np.nan
    return vals

df = df.apply(add_random_na,axis=1)

答案 2 :(得分:1)

以下是基于Randomly insert NA's values in a pandas dataframe的答案:

replaced = collections.defaultdict(set)
ix = [(row, col) for row in range(df.shape[0]) for col in range(df.shape[1])]
random.shuffle(ix)
to_replace = int(round(.1*len(ix)))
for row, col in ix:
    if len(replaced[row]) < df.shape[1] - 1:
        df.iloc[row, col] = np.nan
        to_replace -= 1
        replaced[row].add(col)
        if to_replace == 0:
            break

shuffle操作将导致索引的随机顺序,if子句将避免替换整行。