2016-08-05 99 views
1

数据框柱如果我有2个dataframes喜欢这两个:熊猫:创建基于其他数据框

import pandas as pd 

df1 = pd.DataFrame({'Type':list('AABAC')}) 
df2 = pd.DataFrame({'Type':list('ABCDEF'), 'Value':[1,2,3,4,5,6]}) 

    Type 
0 A 
1 A 
2 B 
3 A 
4 C 

    Type Value 
0 A  1 
1 B  2 
2 C  3 
3 D  4 
4 E  5 
5 F  6 

我想补充的基础上DF2的值DF1列。 df2仅包含唯一值,而df1具有每个值的多个条目。 所以导致DF1应该是这样的:

Type Value 
0 A  1 
1 A  1 
2 B  2 
3 A  1 
4 C  3 

我的实际数据帧DF1是很长,所以我需要的东西是有效的(我试过在一个循环,但这需要永远)。

+0

by'the values'你只是指df2中的'Value'列吗? –

+2

有很多类似的问题和方法,你认为'merge'例如? – EdChum

+0

是的,正是基于'价值'一栏 – petetheat

回答

2

你可以从你的df2创建dictto_dict方法,然后map结果Typedf1

replace_dict = dict(df2.to_dict('split')['data']) 

In [50]: replace_dict 
Out[50]: {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6} 

df1['Value'] = df1['Type'].map(replace_dict) 

In [52]: df1 
Out[52]: 
    Type Value 
0 A  1 
1 A  1 
2 B  2 
3 A  1 
4 C  3 
+2

的初始顺序,你可以在df2上设置索引'Type',所以df1 ['Value'] = df1 ['Type']。map(df2.set_index('Type')['Value' ])'也可以工作 – EdChum

+0

@EdChum这与上面的例子一起工作,但不能与我的完整数据集'pandas.core.index.InvalidIndexError:Reindexing只对唯一有价值的索引对象有效' – petetheat

+0

它可以帮助我们,如果你发布一个有代表性的例子来停止浪费我们的时间来帮助你,如果你发布一个简单的例子,你会得到一个简单的答案。发表一个代表性的例子或你的真实数据 – EdChum

2

按照要求我张贴,使用map,而无需创建一个临时的字典的解决方案:

In[3]: 
df1['Value'] = df1['Type'].map(df2.set_index('Type')['Value']) 
df1 

Out[3]: 
    Type Value 
0 A  1 
1 A  1 
2 B  2 
3 A  1 
4 C  3 

这依赖于一对夫妇,被查找的关键值存在erwise我们得到一个KeyError和我们没有在df2重复条目,否则设置索引提高InvalidIndexError: Reindexing only valid with uniquely valued Index objects

0

另一种方式做,这是通过使用基于索引loc的标签。首先使用.set_index使用Type列索引,然后访问使用df1列,并重置指数为原始与.reset_index

df2.set_index('Type').loc[df1['Type'],:].reset_index() 

要么将​​此作为新的df1或提取Value柱:

df1['Value'] = df2.set_index('Type').loc[df1['Type'],:].reset_index()['Value']