在不使用 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 具有特定大小的列表或数组的任何函数。
我有一个 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 具有特定大小的列表或数组的任何函数。