归因于另一个数据框的数字-Series([],名称:id,dtype:float64)

时间:2019-02-22 09:06:31

标签: python pandas dataframe attributes

我有两个熊猫数据框,第一个是命名源,其中我们具有ID和名称(ID,用户名)  import timeit format = """ def format(name, age): return ( f'He said his name is ' f'{name} and he is ' f'{age} years old.' ) """, """ def format(name, age): return ( 'He said his name is ' f'{name} and he is ' f'{age} years old.' ) """ test = """ def test(): for name in ('Fred', 'Barney', 'Gary', 'Rock', 'Perry', 'Jackie'): for age in range (20, 200): format(name, age) """ for fmt in format: print(timeit.timeit('test()', fmt + test, number=10000)) [out]: 3.4188902939995387 3.3931472289996236

enter image description here

第二个名为data_code,其中我们也只有unsernames(0)列和一个code列,我将尝试在其中获取ID。

source.head()

enter image description here

我所做的是创建一个函数,该函数将在两个数据框中查找相同的用户名,并从源数据框中获取用户名的ID,如果不存在,则会生成一个随机ID。在我的解决方案中,我试图创建一个字典,其中只有唯一的值。

data_code.head()

然后我将使用此功能用ID填充字典

uniqueIDs = data_code[0].unique()
FofToID= {}

输出如下: enter image description here 我的问题是for i in range(len(uniqueIDs)): if uniqueIDs[i] in list(source["username"]): FofToID[uniqueIDs[i]]= np.float_(source[source["username"]==i]["id"]) else: FofToID[uniqueIDs[i]]= int(random.random()*10000000) 数据框中存在的所有值都获得值Series([],名称:id,dtype:float64)。我试图解决此问题,但失败了。

2 个答案:

答案 0 :(得分:1)

使用merge进行左连接,对于不存在的值id使用fillna,最后由set_indexto_dict创建Series:< / p>

source = pd.DataFrame({'id':[111111,222222,666666,888888], 'username':['aa','ss','dd','ff']})
data_code = pd.DataFrame({'code':[0]*4, 0:['ss','dd','rr','yy']})


FofToID = (data_code.merge(source, left_on=0, right_on='username', how='left')
               .fillna({'id': int(random.random()*10000000)})
               .set_index(0)['id']
               .to_dict()
                )
print (FofToID)
{'ss': 222222.0, 'dd': 666666.0, 'rr': 367044.0, 'yy': 367044.0}

答案 1 :(得分:0)

我要感谢@jezrael的贡献,这是我得到的最终解决方案:

for i in range(len(uniqueIDs)):
if uniqueIDs[i] in list(source["username"]): FofToID[uniqueIDs[i]]= int(source[source["username"]==uniqueIDs[i]]["id"])
else: FofToID[uniqueIDs[i]]= int(random.random()*10000000)

输出如下所示

enter image description here