有人可以帮我理解这个吗?
让我们拥有这个 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???”
答案 0 :(得分:3)
我们可以基于普通的parent_id
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