Python—查找dataframe中的值并返回随机对应值
df1有很多NaN值 我已经编译了df2,其中包含代码和名称的所有唯一值 我需要将df1中的NaN代码值替换为df2中的随机代码值,其中df1和df2在名称上匹配Python—查找dataframe中的值并返回随机对应值,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,df1有很多NaN值 我已经编译了df2,其中包含代码和名称的所有唯一值 我需要将df1中的NaN代码值替换为df2中的随机代码值,其中df1和df2在名称上匹配 df1 = pd.DataFrame(columns=['ID','name','code']) df1.ID = [1,2,3,4] df1.name = ['A','A','B','B'] df1.code = [np.nan,np.nan,np.nan,np.nan] df2 = pd.DataFrame(columns=['
df1 = pd.DataFrame(columns=['ID','name','code'])
df1.ID = [1,2,3,4]
df1.name = ['A','A','B','B']
df1.code = [np.nan,np.nan,np.nan,np.nan]
df2 = pd.DataFrame(columns=['name','code'])
df2.name = ['A','A','A','A','B','B','B','B']
df2.code = ['a','b','c','d','e','f','g','h']
df1
df2
示例结果
您可以创建一个字典,其中键是名称,值是可能的代码,然后针对df1示例中的每个名称,从相应的值:
import random
lookup = df2.groupby('name')['code'].apply(list).to_dict()
df1['code'] = df1['code'].fillna(pd.Series([random.choice(lookup[name]) for name in df1['name']],
index=df1.index))
print(df1)
输出
ID name code
0 1 A b
1 2 A b
2 3 B g
3 4 B g
ID name code
0 1 A d
1 2 A a
2 3 B e
3 4 B h
如果需要无需更换的样品,您可以:
lst = [s for k, g in df1.groupby('name', as_index=False) for s in random.sample(lookup[k], len(g))]
df1['code'] = df1['code'].fillna(pd.Series(lst, index=df1.index))
print(df1)
输出
ID name code
0 1 A b
1 2 A b
2 3 B g
3 4 B g
ID name code
0 1 A d
1 2 A a
2 3 B e
3 4 B h
将每组的值加入列表后,可以使用
random.sample
和pas2
。然后,合并回初始数据帧,分解列表并删除重复项()
因为某些原因,爆炸对我不起作用。AttributeError:“DataFrame”对象没有属性“explode”@BD12您必须升级您的pandas版本