【问题标题】:How to count the category in one dataframe based on another dataframe?如何根据另一个数据框计算一个数据框中的类别?
【发布时间】:2019-02-09 15:52:34
【问题描述】:

我想根据另一个数据集中的详细信息为数据集中的每一行添加学生类型的计数。

我有 2 个数据框。一个包含学生批次详细信息,另一个包含分数。我想加入 2 个数据框。

Dataframe1 包含

+-------+-------+-------+--+
|  s1   |  s2   |  s3   |  |
+-------+-------+-------+--+
| Stud1 | Stud2 | Stud3 |  |
| Stud2 | Stud4 | Stud1 |  |
| Stud1 | Stud3 | Stud4 |  |
+-------+-------+-------+--+

Dataframe2 包含

+-------+-------+----------+--+
| Name  | Point | Category |  |
+-------+-------+----------+--+
| Stud1 |    90 | Good     |  |
| Stud2 |    80 | Average  |  |
| Stud3 |    95 | Good     |  |
| Stud4 |    55 | Poor     |  |
+-------+-------+----------+

我正在尝试在同一数据集中为每一行映射每个类别中的人数。

+-------+-------+-------+------+---------+------+
|  S1   |  S2   |  S3   | Good | Average | Poor |
+-------+-------+-------+------+---------+------+
| Stud1 | Stud2 | Stud3 |    2 |       1 |    0 |
| Stud2 | Stud4 | Stud1 |    1 |       1 |    1 |
| Stud1 | Stud3 | Stud4 |    2 |       0 |    1 |
+-------+-------+-------+------+---------+------+

我在下面尝试过,但没有成功

s = df.set_index('Name')['Category']
df6 = df5.join(df5.replace(s).add_prefix('Type_'))

【问题讨论】:

    标签: python pandas dataframe join


    【解决方案1】:

    答案的第一部分与previous one 相同,只有replace 由另一个SeriesCategory,然后使用value_counts,将缺失值替换为0,最后将全部转换为整数:

    s1 = dfnamepoints.set_index('Name')['Category']
    df = df3.join(df3.replace(s1).apply(pd.value_counts, axis=1).fillna(0).astype(int))
    print (df)
          s1     s2     s3  Average  Good  Poor
    0  Stud1  Stud2  Stud3        1     2     0
    1  Stud2  Stud4  Stud1        1     1     1
    2  Stud1  Stud3  Stud4        0     2     1
    

    编辑:为指定列替换使用子集list

    s = dfnamepoints.set_index('Name')['Category']
    cols = ['s1','s2','s3']
    df = df3.join(df3[cols].replace(s).apply(pd.value_counts, 1).fillna(0).astype(int))
    

    【讨论】:

    • 感谢您的回复。但是,当我低于 1 时,这甚至会出现在新列中。有没有办法指定我们需要计数的列? stackoverflow.com/a/54607134/2901002
    • @DevAnanth - 第一部分似乎相同,但需要另一列替换之前的答案 - 将 s = dfnamepoints.set_index('Name')['Point'] 更改为 s1 = dfnamepoints.set_index('Name')['Category'],然后在 replace 之后添加 apply
    • 我不知道我是否正确解释了问题。在上面的示例中,假设我有另一列 s4,但我不想对其进行转换。我只想计算 s1、s2 和 s3 的类别。
    • @DevAnanth - 我现在明白了,请检查编辑后的答案。相同的解决方案适用于先前的答案。
    • 这正是我正在寻找的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多