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>
我有两个数据框,我想使用框架 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>