在不使用 fillna 的情况下用随机字符串替换 pandas DataFrame 中的 NaN

Replace NaN in pandas DataFrame with random strings without using fillna

我有一个 pandas DataFrame 如下所示

      NAME      EMAIL      HEIGHT      WEIGHT

1     jlka       NaN        170          70

2     qwer     eee@ttt      180          80

3     ioff       NaN        175          75

4     iowu     iou@add      170          60

我想用不重复的随机字符串替换 'EMAIL' 列中的 NaN,它不一定包含 @。

我试图制作一个 def 来生成随机字符串,但 NaN 被替换为相同的随机字符串,因为我毕竟使用了 'fillna' 方法。

好像,正如我看到的其他 Q$A,fillna 中的 def 只工作一次,并用相同的值替换所有 NaN 或从 def 中输出字符串。

我是不是应该试试'for'句来一个一个替换?

或者是否有更 Pythonic 的方式来替换它们?

你可以尝试这样的事情:

import pandas as pd
from numpy import nan
import random
import string

df = pd.DataFrame({
    'Name': ['aaa','bbb','CCC'],
    'Email': [nan,'ddd',nan]})

def processNan (x):
    return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(10))

df['Email'] = df['Email'].apply(lambda x: processNan(x) if x is nan else x)

您可以使用 pd.util.testing.rands_array,将所需字符串的长度作为第一个 (nchars) 参数传递给它,将 NaN 的数量作为第二个(大小)参数传递给它:

df.loc[df.EMAIL.isna(), "EMAIL"] = pd.util.testing.rands_array(10, sum(df.EMAIL.isnull()))      

>>> df                                                                                              

   NAME       EMAIL  HEIGHT  WEIGHT
1  jlka  YxzVaC38uw     170      70
2  qwer     eee@ttt     180      80
3  ioff  33kyDArtip     175      75
4  iowu     iou@add     170      60

pd.util.testing.rand_array 可以替换为 returns 具有特定大小的列表或数组的任何函数。