pandas 中数据的条件合并和转换

Conditional merge and transformation of data in pandas

我有两个数据框,我想使用框架 2 的属性在框架 1 中创建新列

第 1 帧

    Name
    alice
    bob
    carol

第 2 帧

    Name  Type  Value
    alice lower 1
    alice upper 2
    bob   equal 42
    carol lower 0

想要的结果

第 1 帧

    Name   Lower Upper
    alice      1     2
    bob       42    42
    carol      0    NA
    

因此,两个框架的共同列是名称。您可以使用 Name 来查找(变量的)边界,这些边界在第二个框架中指定。第 1 帧只列出每个名称一次。第 2 帧每帧可能有一个或两个条目,这可能指定下限或上限(如果类型相同,则一次指定两者)。我们不需要为每个变量设置两个边界,其中一个边界可以留空。我想要一个列出每个变量范围的框架。我看到了如何在列上使用 for 循环来做到这一点,但这似乎不符合 pandas 精神。您对紧凑型解决方案有什么建议吗? :-) 提前致谢

您不是在寻找合并,而是在寻找 pivot

(df2[df2['Name'].isin(df1['Name'])]
 .pivot('Name', 'Type', 'Value')
 .reset_index()
)

但这并不能处理特殊的 'equal' 情况。

为此,您可以使用一个小技巧。将 'equal' 替换为包含其他两个值的列表,然后 explode 以创建两行。

(df2[df2['Name'].isin(df1['Name'])]
 .assign(Type=lambda d: d['Type'].map(lambda x: {'equal': ['lower', 'upper']}.get(x,x)))
 .explode('Type')
 .pivot('Name', 'Type', 'Value')
 .reset_index()
 .convert_dtypes()
)

输出:

    Name  lower  upper
0  alice      1      2
1    bob     42     42
2  carol      0   <NA>