【问题标题】:Count number of child records in dataframe计算数据框中的子记录数
【发布时间】:2021-04-17 17:46:25
【问题描述】:

我有一个带有 parentIdid_x 列的 pandas.DataFrame。我现在正在尝试创建一个新列,该列显示父条目中相关子项的数量(id_x)。一个条目 (id) 的相关 SQL 查询将是 SELECT COUNT(*) AS amount FROM node WHERE parentId="1234qwer"。有没有办法将它应用于熊猫数据框中的每一行?在数据框中,父母也有可能是更高父母的孩子。

编辑:

这是数据样本

df[["parentId", "id_x"]].head(4)

|               parentId               |                 id_x                 |
| ------------------------------------ | ------------------------------------ |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a061e7d7-95d2-4812-87c1-24ec24fc2dd2 |
| a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | d2b62e36-b243-43ac-8e45-ed3f269d50b2 |
|                 None                 | 071cb2c2-d1be-4154-b6c7-a29728357ef3 |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a0e97b37-b9a1-4304-9769-b8c48cd9f184 |

有 n 个parentId 可以匹配id_x。我现在想创建一个新列来计算/显示与特定 id_x 匹配的 parentId 的数量。

结果应如下所示:

 df[["parentId", "id_x", "Amount"]].head(4)

|               parentId               |                 id_x                 | Amount |
| ------------------------------------ | ------------------------------------ | ------ |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | 1      |
| a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | d2b62e36-b243-43ac-8e45-ed3f269d50b2 | 0      |
|                 None                 | 071cb2c2-d1be-4154-b6c7-a29728357ef3 | 2      |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a0e97b37-b9a1-4304-9769-b8c48cd9f184 | 0      |

【问题讨论】:

  • 不太清楚您要实现什么,请发布数据示例(几行重要的行),包括输入和预期输出。
  • 我编辑了我最初的问题。抱歉,这是我第一次在这里提问。感谢您的帮助!
  • 正如@joao 所说,发布示例数据的预期输出。 Avoid upload image of code.
  • @Corralien 我把图片改成代码并提供了预期的输出。

标签: python pandas dataframe


【解决方案1】:

输入:

>>> df
                               parentId                                  id_x
0  071cb2c2-d1be-4154-b6c7-a29728357ef3  a061e7d7-95d2-4812-87c1-24ec24fc2dd2
1  a061e7d7-95d2-4812-87c1-24ec24fc2dd2  d2b62e36-b243-43ac-8e45-ed3f269d50b2
2                                   NaN  071cb2c2-d1be-4154-b6c7-a29728357ef3
3  071cb2c2-d1be-4154-b6c7-a29728357ef3  a0e97b37-b9a1-4304-9769-b8c48cd9f184

输出:

>>> df.assign(amount=df["id_x"].map(df["parentId"].value_counts()).fillna(0))
                               parentId                                  id_x  amount
0  071cb2c2-d1be-4154-b6c7-a29728357ef3  a061e7d7-95d2-4812-87c1-24ec24fc2dd2     1.0
1  a061e7d7-95d2-4812-87c1-24ec24fc2dd2  d2b62e36-b243-43ac-8e45-ed3f269d50b2     0.0
2                                   NaN  071cb2c2-d1be-4154-b6c7-a29728357ef3     2.0
3  071cb2c2-d1be-4154-b6c7-a29728357ef3  a0e97b37-b9a1-4304-9769-b8c48cd9f184     0.0

计算parentId 唯一值的数量并将它们映射到id_x,然后分配给数据框的amount 列。

【讨论】:

  • 抱歉,这会导致错误:传递的项目数错误 13,位置暗示 1
【解决方案2】:

解决了

def node_counter(id_x, parent_ID):
        counter = 0
        for child in parent_ID:
            if child == id_x:
                counter += 1
        return counter
    
df['Amount'] = df.apply(lambda x: node_counter(x['id_x'], df['parentId']), axis=1)

df

|               parentId               |                 id_x                 | Amount |
| ------------------------------------ | ------------------------------------ | ------ |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | 1      |
| a061e7d7-95d2-4812-87c1-24ec24fc2dd2 | d2b62e36-b243-43ac-8e45-ed3f269d50b2 | 0      |
|                 None                 | 071cb2c2-d1be-4154-b6c7-a29728357ef3 | 2      |
| 071cb2c2-d1be-4154-b6c7-a29728357ef3 | a0e97b37-b9a1-4304-9769-b8c48cd9f184 | 0      |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多