我有一个两列之间有关系的熊猫数据帧。
index| name | manager |
-----+------+---------+
0| Bob | Bob |
1| Mary | Sue |
2| Sue | Bob |
3| Ann | Sue |
我想创建一个新列,从经理列中查找每个人员经理的姓名,并将该行的索引值用于新系列。
index| name | manager | mananger_index |
-----+------+---------+----------------+
0| Bob | Bob | 0|
1| Mary | Sue | 2|
2| Sue | Bob | 0|
3| Ann | Sue | 2|
现在,如果我使用纯python解决方案来解决问题,我会这样做:
# Create a dict from names to row indexes
name_lookup = {}
for row in df.iterrows():
name_lookup[row.name] = row.index
# Lookup manager's row index for each person's manager.
mananger_indexes = []
for row in df.iterrows():
mananger_indexes.append(name_lookup[row.manager])
# Save my new column
df['mananger_index'] = mananger_indexes
但考虑到它是熊猫,可能有一个不错的一两行解决方案。
您可以按名称为经理编制索引,并使用map
:
manager_indexed_by_name = df['name'].reset_index().set_index('name')['index']
df['manager_index'] = df['manager'].map(manager_indexed_by_name)
或单行:
df['manager_index'] = df['manager'].map(df['name'].reset_index()
.set_index('name')['index'])
输出:
name manager manager_index
0 Bob Bob 0
1 Mary Sue 2
2 Sue Bob 0
3 Ann Sue 2
只需将该python代码的每个部分翻译成其Pandas等效项,这就可以成为一个简单的两行代码。
-
我们可以通过切换序列的索引和值来获取查找表以从值中查找索引。
-
Series.map(( 可以采用类似字典的对象来查找值,而不仅仅是为每个值运行的代码 lambda。
manager_lookup = pd.Series(df.index.values, index=df.name)
df['manager_index'] = df.manager.map(manager_lookup)