使用随机字符串替换 Pandas DataFrame 中的 NaN,而不使用 fillna 方法

3

我有一个如下所示的pandas数据框:

      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,但由于最终使用了“fillna”方法,NaN被替换为相同的随机字符串。

似乎,根据其他Q&A,fillna中的def仅起作用一次,并用来替换所有NaN,其值或字符串都来自def。

我应该尝试使用“for”语句逐个替换它们吗?

还是有更Pythonic的方法可以替换它们?


我很好奇,如果没有电子邮件,使用None有什么问题? - Guilhem L.
2个回答

3

你可以尝试像这样做:

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)

1
抱歉,我在这里太新了。我已经标记了您的答案! - user12929266

1
您可以使用pd.util.testing.rands_array,将所需字符串的长度作为第一个(nchars)参数传递,并将NaN的数量作为第二个(size)参数传递:
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 可以被替换为返回指定大小的列表或数组的任何函数。


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