如果我有两个这样的数据帧:
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 :(得分:2)
您可以使用dict
方法从df2
创建to_dict
,然后map
生成Type
df1
列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
:
delete(EntityId)
答案 1 :(得分: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
这依赖于一些事情,即正在查找的关键值存在,否则我们得到KeyError
并且我们在df2
中没有重复的条目,否则设置索引提出InvalidIndexError: Reindexing only valid with uniquely valued Index objects
答案 2 :(得分:0)
另一种方法是使用基于标签的索引器loc
。首先使用Type
列作为索引使用.set_index
,然后使用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']