用其他行中的值填充列

2024-09-27 04:18:58 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能帮我理解吗

让我们使用这个数据帧:

df = pd.DataFrame({
    "id": ['a', 'b', 'c', 'd', 'e'],
    "parent_id": [None, None, 'a', 'b', 'a'],
    "name": ["Bob", "Jane", "John", "Patty", "Sam"],
})

现在,我想检索每个子名称旁边的父名称,如下所示:

+----+-----------+-------+-------------+
| id | parent_id | name  | parent_name |
+----+-----------+-------+-------------+
| a  | None      | Bob   | NaN         |
+----+-----------+-------+-------------+
| b  | None      | Jane  | NaN         |
+----+-----------+-------+-------------+
| c  | a         | John  | Bob         |
+----+-----------+-------+-------------+
| d  | b         | Patty | Jane        |
+----+-----------+-------+-------------+
| e  | a         | Sam   | Bob         |
+----+-----------+-------+-------------+

所以我这样做:

df['parent_name'] = None
df['parent_name'] = df['parent_id'].apply(lambda x: df['name'][df['id']==x])

但我得到的是:

+----+-----------+-------+-------------+
| id | parent_id | name  | parent_name |
+----+-----------+-------+-------------+
| a  | None      | Bob   | NaN         |
+----+-----------+-------+-------------+
| b  | None      | Jane  | NaN         |
+----+-----------+-------+-------------+
| c  | a         | John  | Bob         |
+----+-----------+-------+-------------+
| d  | b         | Patty | NaN         |
+----+-----------+-------+-------------+
| e  | a         | Sam   | Bob         |
+----+-----------+-------+-------------+

因此,它似乎只处理name列中的第一项

柏拉图引用苏格拉底的话:“WTF


Tags: 数据name名称noneiddataframedfsam
3条回答

我不认为如何使用apply,但您可以使用merge:

df['parent_name'] = df[['parent_id']].merge(df[['id', 'name']], left_on=['parent_id'], right_on=['id'], how='left')['name']

#   id parent_id   name parent_name
# 0  a      None    Bob         NaN
# 1  b      None   Jane         NaN
# 2  c         a   John         Bob
# 3  d         b  Patty        Jane
# 4  e         a    Sam         Bob

我们可以基于公共id尝试mappingparent_id和相应的parent_name

df['parent_name'] = df['parent_id'].map(df.set_index('id')['name'])

  id parent_id   name parent_name
0  a      None    Bob         NaN
1  b      None   Jane         NaN
2  c         a   John         Bob
3  d         b  Patty        Jane
4  e         a    Sam         Bob

尝试合并

final = df.merge(df[["id", "name"]].rename(
    columns={"name": "parent_name"}),
    left_on="parent_id",
    right_on="id",
    how="left"
)

相关问题 更多 >

    热门问题