Python 如何基于另一个数据帧计算一个数据帧中的类别?
我想根据另一个数据集中的详细信息,为数据集中的每一行添加学生类型计数 我有两个数据帧。一个包含学生批次详细信息,另一个包含分数。我想加入2个数据帧 Dataframe1包含Python 如何基于另一个数据帧计算一个数据帧中的类别?,python,pandas,dataframe,join,Python,Pandas,Dataframe,Join,我想根据另一个数据集中的详细信息,为数据集中的每一行添加学生类型计数 我有两个数据帧。一个包含学生批次详细信息,另一个包含分数。我想加入2个数据帧 Dataframe1包含 +-------+-------+-------+--+ | s1 | s2 | s3 | | +-------+-------+-------+--+ | Stud1 | Stud2 | Stud3 | | | Stud2 | Stud4 | Stud1 | | | Stud1 | Stud3 |
+-------+-------+-------+--+
| 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_'))
答案的第一部分与中相同,仅用另一个
系列
替换为类别
,然后使用,将缺少的值替换为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
编辑:对于指定列以将使用子集替换为列表
:
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以下做的时候,甚至这个都会出现在新的专栏中。有没有办法指定我们需要计数的列@DevAnanth-第一部分似乎相同,但需要上一个答案的另一列替换-更改
s=dfnamepoints。将索引('Name')['Point']
设置为s1=dfnamepoints。设置索引('Name')['Category']
,然后在replace
之后添加apply
,我不知道我是否正确解释了这个问题。在上面的例子中,假设我有另一列s4,但我不想转换它。我只想计算s1、s2和s3的类别。@DevAnanth-我现在明白了,请检查编辑的答案。同样的解决方案适用于前面的答案。这正是我想要的。谢谢。