我有一个像下面的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方式来替换它们?
答案 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
可以用任何返回特定大小的列表或数组的函数代替。