我想在数据框(Global_Dataset)上基于其他数据框(List_Data)创建一个新列(Col_val)。 我需要一个更快代码,因为我有一个200万个样本的数据集,而List_data包含50000个样本。
Col_Val 必须根据 Col_Key
包含列值的值列表数据:
id Key Value
1 5 0
2 7 1
3 9 2
Global_Dataset:
id Col_Key Col_Val
1 9 2
2 5 0
3 9 2
4 7 1
5 7 1
6 5 0
7 9 2
8 7 1
9 9 2
10 5 0
我已经尝试过此代码,但是需要很长时间才能执行。还有其他更快的方法可以实现我的目标吗?
Col_Val = []
for i in range (len(List_Data)):
for j in range (len(Global_Data)):
if List_Data.get_value(i, "Key") == Global_Data.get_value(j, 'Col_Key') :
Col_Val.append(List_Data.get_value(i, 'Value'))
Global_Data['Col_Val'] = Col_Val
PS:我尝试使用loc和iloc而不是get_value,但它的运行速度非常慢
答案 0 :(得分:3)
没有理由手动或使用iterrows
遍历任何内容。如果我了解您的问题,这应该是一个简单的merge操作。
df
Key Value
id
1 5 0
2 7 1
3 9 2
global_df
Col_Key
id
1 9
2 5
3 9
4 7
5 7
6 5
7 9
8 7
9 9
10 5
global_df.reset_index()\
.merge(df, left_on='Col_Key', right_on='Key')\
.drop('Key', axis=1)\
.set_index('id')\
.sort_index()
Col_Key Value
id
1 9 2
2 5 0
3 9 2
4 7 1
5 7 1
6 5 0
7 9 2
8 7 1
9 9 2
10 5 0
请注意,其本质是global_df.merge(...)
,但是额外的操作是保留原始索引并删除不需要的额外列。我建议您分别尝试每个步骤以查看结果。
答案 1 :(得分:2)
尝试一下:
data_dict = {key : value for key, value in zip(List_Data['Key'], List_Data['Value'])}
Global_Data['Col_Val'] = pd.Series([data_dict[key] for key in Global_Data['Col_Key']])
我不知道您需要处理的数据量将花费您的计算机多长时间,但是它应该比您现在正在使用的速度更快。
您也可以使用data_dict = {row['Key'] : row['Value'] for _, row in list_data.iterrows()}
生成字典,但是在我的机器上比我上面建议的要慢。
它假设Global_Data['Col_Keys']
中的所有键都在List_Data['Key']
中存在,否则会得到KeyError
。