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

标签 pandas dataframe csv merge

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

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

最佳答案

您不是在寻找合并,而是在寻找枢轴

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

但这并不能处理特殊的“相等”情况。

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

(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>

关于pandas - pandas 中数据的条件合并和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70599486/

相关文章:

python - 将 pandas 中的月份数字转换为日期时间

python - Pandas 系列中的字符串过滤器

python - Pandas Dataframe : How to select a row by index, 然后获取接下来的几行

python - 当我将多个数据帧存储在数据帧列表中并且我记忆起其中一个时,有没有办法格式化输出的列标题?

pandas - 将滚动函数应用于多列的 groupby

python - 从 DataFrame 列标题中删除非 ASCII 字符

python - 使用 pd.read_clipboard 复制 MultiIndex 数据帧?

r - 从数据框创建混淆矩阵

java - Jar 找不到主方法 - 连接到主类,但无法访问方法

csv - 将应用程序移动到新服务器后,使用 CsvHelper 库生成的 CSV 文件中缺少逗号/分隔符