熊猫数据框在不同的数据框中查找一个值并分配一个值

Posted

技术标签:

【中文标题】熊猫数据框在不同的数据框中查找一个值并分配一个值【英文标题】:Pandas dataframe lookup a value in different dataframe and assign a value 【发布时间】:2017-07-14 03:24:35 【问题描述】:

我有 2 个不同的数据框。 第一个看起来像:

     joint  label     x    z      y    pt
0        1    NaN  50.4  0.0  -8.40    10
1        2  shell  52.2  0.0  -8.40    20
2        3  shell  54.0  0.0  -8.40    30
3        4  shell  55.8  0.0  -8.40    40
4        5  shell  57.6  0.0  -8.40    50

我的第二个数据框看起来像:

     member  joint1  joint2        joint1_pt        joint2_pt
0         1       1       2                0                0
1         2       2       3                0                0
2         3       3       4                0                0
3         4       4       5                0                0

我想使用与特定关节对应的 pt 值,并在第二个数据帧上使用它,因此它如下所示:

     member  joint1  joint2        joint1_pt        joint2_pt
0         1       1       2                10              20
1         2       2       3                20              30
2         3       3       4                30              40
3         4       4       5                40              50

你能帮我举个例子/想法,我应该如何处理这个问题? 提前谢谢你!

【问题讨论】:

您可以使用pd.DataFrame.to_dict(如this)和pd.Series.map(如this)。 【参考方案1】:

您需要 dictdict 使用 set_indexto_dict 创建的 to_dict,如 cmets 中的 P-robot 所指:

d = df1.set_index('joint')['pt'].to_dict()
#mapping by Series works, but a bit slowier
#d = df1.set_index('joint')['pt']
print (d)
1: 10, 2: 20, 3: 30, 4: 40, 5: 50

df2['joint1_pt'] = df2['joint1'].map(d)
df2['joint2_pt'] = df2['joint2'].map(d)
print (df2)
   member  joint1  joint2  joint1_pt  joint2_pt
0       1       1       2         10         20
1       2       2       3         20         30
2       3       3       4         30         40
3       4       4       5         40         50

【讨论】:

我尝试实现您的代码,但在joint1_pt 和joint2_pt 列中得到NaN 检查 dtypes,可能需要转换为 str 或 int,如 df2['joint1_pt'] = df2['joint1'].astype(str).map(d)df2['joint1_pt'] = df2['joint1'].astype(int).map(d),因为需要相同。 在dict和列joint1和join2中相同。 你知道为什么在我的例子中你的代码的第一行返回字典键的字符串类型吗?作为第二行,我添加了这一行d = int(k):int(v) for k,v in d.items(),它现在可以工作了。但很好奇为什么在你的键中返回整数类型。非常感谢!!【参考方案2】:

您可以使用merge,合并后将pt分配给joint1_pt和joint2_pt,最后删除不需要的列。

df= pd.merge(df2,df1[['joint','pt']], right_on='joint',left_on='joint1',how='left')
df= pd.merge(df,df1[['joint','pt']], right_on='joint',left_on='joint2',how='left')
df[['joint1_pt','joint2_pt']] =df[['pt_x','pt_y']] 
df=df[['member','joint1','joint2','joint1_pt','joint2_pt']]
print df

输出

   member  joint1  joint2  joint1_pt  joint2_pt
0       1       1       2         10         20
1       2       2       3         20         30
2       3       3       4         30         40
3       4       4       5         40         50

【讨论】:

df1['joint','pt'] 似乎不起作用。我得到一个 KeyError: ('joint', 'pt')。即使我尝试打印它也不起作用。但是当我尝试单独打印它们时,它可以工作。有什么想法吗? 感谢您的帮助!它没有给出和错误的工作,但你知道为什么它为joint1_pt和joint2_pt列中的所有条目返回一个NaN吗? 使用示例数据,它工作正常,可能'joint'值与joint1和joint2不匹配,在这些情况下它可能是Nan

以上是关于熊猫数据框在不同的数据框中查找一个值并分配一个值的主要内容,如果未能解决你的问题,请参考以下文章

在(一个非常大的)熊猫数据框中定位值并存储到字典中

如何在熊猫数据框中拆分值并插入新行?

如何使用熊猫从另一个数据框中的一个数据框中查找值?

FutureWarning:元素比较失败;从熊猫数据框中删除所有行时

在熊猫数据框中查找上一个组的名称

如何将列表中的值分配给熊猫数据框并控制每个列表元素在数据框中的分布/频率