Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—查找dataframe中的值并返回随机对应值_Python_Pandas_Numpy_Dataframe - Fatal编程技术网

Python—查找dataframe中的值并返回随机对应值

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有很多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=['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
和pas
2
。然后,合并回初始数据帧,
分解列表并
删除重复项()


因为某些原因,爆炸对我不起作用。AttributeError:“DataFrame”对象没有属性“explode”@BD12您必须升级您的pandas版本