如何将值从一个数据框快速复制到另一数据框

时间:2019-05-08 15:42:30

标签: python dataframe

我想在数据框(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,但它的运行速度非常慢

2 个答案:

答案 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