【问题标题】:Filling a column with values from other rows with pandas [duplicate]用pandas用其他行的值填充一列[重复]
【发布时间】:2021-08-02 15:31:09
【问题描述】:

有人可以帮我理解一下吗?

让我们拥有这个 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???”

【问题讨论】:

  • @jezrael 你确定标记的欺骗是正确的吗?在这个问题中,只有一个数据框而不是两个。也许如果你想关闭它找到更好的骗局。
  • @ShubhamSharma - 感谢您的评论,已添加到骗子列表中。

标签: python pandas dataframe


【解决方案1】:

我们可以尝试mappingparent_id与对应的parent_name基于常见的id

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

【讨论】:

    【解决方案2】:

    尝试合并

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        相关资源
        最近更新 更多