【发布时间】:2021-06-18 15:15:09
【问题描述】:
我有一些像这样(简化)的代码。实际的数据列表有数万个,而不仅仅是 3 个。
有一本员工词典,我从中制作了一个 DataFrame。 有一个字典对象列表,其中包含额外的员工信息。
还有:
- 员工列表和额外员工信息 (master_info_list) 重叠,但每个项目都有各自独有的项目。
- 我使用的“索引”(StaffNumber)实际上是在额外人员信息中以“SN_”为前缀的,所以无法直接比较。
- 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 的答案之后——我认为它以一种不同且更有效的方式解决了这个问题。谢谢。