用 Pandas 填充来自其他行的值的列

时间:2021-05-12 09:20:31

标签: python pandas dataframe

有人可以帮我理解这个吗?

让我们拥有这个 DataFrame:

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???”

3 个答案:

答案 0 :(得分:3)

我们可以基于普通的parent_id

尝试mapping和对应的parent_name的{​​{1}}
id

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

答案 1 :(得分:1)

尝试合并

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

答案 2 :(得分:0)

我不认为应用是如何使用的,但是您可以使用合并:

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