Pandas:根据其他数据框创建数据框列

时间:2016-08-05 09:05:16

标签: python pandas dataframe

如果我有两个这样的数据帧:

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中的值在d​​f1中添加一列。 df2仅包含唯一值,而df1具有每个值的多个条目。 因此得到的df1应如下所示:

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

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

3 个答案:

答案 0 :(得分:2)

您可以使用dict方法从df2创建to_dict,然后map生成Type df1replace_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']