使用随机字符串替换pandas DataFrame中的NaN而不使用fillna

时间:2020-02-20 02:33:34

标签: python-3.x pandas numpy dataframe 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,但是因为我毕竟使用了'fillna'方法,所以NaN被相同的随机字符串替换了。

就像我看到的其他Q $ As一样,fillna中的def只起作用一次,并用相同的值或所有从def中输出的字符串替换所有NaN。

我应该尝试用“ for”一词一一替换吗?

还是有更多的Python方式来替换它们?

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

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 :(得分:0)

您可以使用pd.util.testing.rands_array,将所需字符串的长度作为第一个(nchars)参数,将NaN s的数目作为第二个(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可以用任何返回特定大小的列表或数组的函数代替。

相关问题