将数据从一个pandas DataFrame传递到另一个pandas Datafframe的最有效方法

时间:2016-11-04 00:53:03

标签: python python-3.x pandas dataframe

我正在尝试通过迭代行找到一种更有效的方法将信息从一个DataFrame传输到另一个DataFrame。我有2个DataFrame,一个包含列中名为“id”的唯一值,另一列中包含名为“region”的值:

dfkey = DataFrame({'id':[1122,3344,3467,1289,7397,1209,5678,1792,1928,4262,9242],
            'region': [1,2,3,4,5,6,7,8,9,10,11]})

      id  region
0   1122       1
1   3344       2
2   3467       3
3   1289       4
4   7397       5
5   1209       6
6   5678       7
7   1792       8
8   1928       9
9   4262      10
10  9242      11

...其他DataFrame包含这些相同的ID,但现在有时重复且没有任何顺序:

df2 = DataFrame({'id':[1792,1122,3344,1122,3467,1289,7397,1209,5678],
            'other': [3,2,3,4,3,5,7,3,1]})

     id  other
0  1792      3
1  1122      2
2  3344      3
3  1122      4
4  3467      3
5  1289      5
6  7397      7
7  1209      3
8  5678      1

我想使用dfkey DataFrame作为键来输入df2 DataFrame中每个id的区域。我已经找到了使用iterrows()执行此操作的方法,但它涉及嵌套循环:

df2['region']=0
for i, rowk in dfkey.iterrows():
    for j, rowd in df2.iterrows():
        if rowk['id'] == rowd['id']: 
            rowd['region'] = rowk['region']

     id  other  region
0  1792      3       8
1  1122      2       1
2  3344      3       2
3  1122      4       1
4  3467      3       3
5  1289      5       4
6  7397      7       5
7  1209      3       6
8  5678      1       7

我拥有的实际dfkey有43K行和df2 600K行。代码已经运行了一个小时,所以我想知道是否有更有效的方法来做这个...

2 个答案:

答案 0 :(得分:1)

pandas.merge可能是另一种解决方案。

newdf = pandas.merge(df2, dfkey, on='id')

In [22]: newdf
Out[22]: 
     id  other  region
0  1792      3       8
1  1122      2       1
2  1122      4       1
3  3344      3       2
4  3467      3       3
5  1289      5       4
6  7397      7       5
7  1209      3       6
8  5678      1       7

答案 1 :(得分:0)

我会使用map()方法:

In [268]: df2['region'] = df2['id'].map(dfkey.set_index('id').region)

In [269]: df2
Out[269]:
     id  other  region
0  1792      3       8
1  1122      2       1
2  3344      3       2
3  1122      4       1
4  3467      3       3
5  1289      5       4
6  7397      7       5
7  1209      3       6
8  5678      1       7

900K行的时间df2 DF:

In [272]: df2 = pd.concat([df2] * 10**5, ignore_index=True)

In [273]: df2.shape
Out[273]: (900000, 3)

In [274]: dfkey.shape
Out[274]: (11, 2)

In [275]: %timeit df2['id'].map(dfkey.set_index('id').region)
10 loops, best of 3: 176 ms per loop