【问题标题】:Populate 2 columns of dataframe at the same time using apply function [duplicate]使用apply函数同时填充2列数据框[重复]
【发布时间】:2021-06-18 15:15:09
【问题描述】:

我有一些像这样(简化)的代码。实际的数据列表有数万个,而不仅仅是 3 个。

有一本员工词典,我从中制作了一个 DataFrame。 有一个字典对象列表,其中包含额外的员工信息。

还有:

  1. 员工列表和额外员工信息 (master_info_list) 重叠,但每个项目都有各自独有的项目。
  2. 我使用的“索引”(StaffNumber)实际上是在额外人员信息中以“SN_”为前缀的,所以无法直接比较。
  3. master_info_list 中的 StaffNumber 重复是有意的(这就是我收到它的方式!)。

我想要做的是将两个新列填充到数据框中,这些列从额外的员工信息中获取数据。我可以通过对 get_department_and_manager 进行 2 次单独调用来做到这一点,一次用于部门,一次用于经理。这样可行。但是,它“感觉”就像我应该能够从 get_department_and_manager 的输出中获取 2 个字段并一次性填充数据帧,但我正在努力使语法正确。什么是正确的语法(如果可能)?此外,以我的方式(使用 for 循环)遍历列表似乎效率低下。有没有更好的办法?

我看到的所有示例似乎都是从数据框中的现有数据创建新列,或者它们是在比较两个“列表”(或列表和字典)之前不需要数据混搭的简单示例。

import pandas as pd


def get_department_and_manager(row, master_list):
    dept = 'bbb'
    manager = 'aaa'
    for i in master_list:
        if i['StaffNumber'] == 'SN_' + row['StaffNumber']:
            dept = i['data']['Department']
            manager = i['data']['Manager']
            break
    return [dept, manager]


staff = {'Name': ['Alice', 'Bob', 'Dave'],
         'StaffNumber': ['001', '002', '004']}

master_info_list = [{'StaffNumber': 'SN_001', 'data': {'StaffNumber': 'SN_001', 'Department': 'Sales', 'Manager': 'Luke' }},
      {'StaffNumber': 'SN_002', 'data': {'StaffNumber': 'SN_002', 'Department': 'Marketing', 'Manager': 'Mary' }},
      {'StaffNumber': 'SN_003', 'data': {'StaffNumber': 'SN_003', 'Department': 'IT', 'Manager': 'Neal' }}]

df = pd.DataFrame(data=staff)
df[['Department']['Manager']] = df.apply(get_department_and_manager, axis='columns', args=[master_info_list])

print(df)

【问题讨论】:

  • 你能从给定的数据框pd.DataFrame(data=staff)发布你的预期输出吗?
  • @dm2 - 几乎:这足以让我知道我哪里出错了:df[['Department']['Manager']] 应该是df[['Department','Manager']],我需要.apply(pd.Series)(不管做什么 - 我'最后必须阅读它)。然后它起作用了。也就是说,在看到下面@Andrej Kesley 的答案之后——我认为它以一种不同且更有效的方式解决了这个问题。谢谢。

标签: python pandas dataframe


【解决方案1】:

如果我理解正确,你可以使用.merge

x = pd.DataFrame([v["data"] for v in master_info_list])
x["StaffNumber"] = x["StaffNumber"].str.split("_").str[-1]
print(df.merge(x, on="StaffNumber", how="left"))

打印:

    Name StaffNumber Department Manager
0  Alice         001      Sales    Luke
1    Bob         002  Marketing    Mary
2   Dave         004        NaN     NaN

【讨论】:

  • 喜欢它。不是严格解决 OP,而是以不同的方式解决问题,这就是我最终采用的方式。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2022-01-16
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2012-03-26
相关资源
最近更新 更多