行和列之间的Python交互
我有以下计划:行和列之间的Python交互,python,pandas,Python,Pandas,我有以下计划: df = pd.DataFrame({ 'student':['a'] * 3 + ['b'] * 3 + ['c'] * 4, 'semester':[1, 1, 2, 2, 1, 1, 2, 2, 2, 2], 'passed_exam':[True, False] * 5, 'exam': [ 'French', 'English', 'Italian', 'Chinese', 'Russian', 'Germ
df = pd.DataFrame({
'student':['a'] * 3 + ['b'] * 3 + ['c'] * 4,
'semester':[1, 1, 2, 2, 1, 1, 2, 2, 2, 2],
'passed_exam':[True, False] * 5,
'exam': [
'French', 'English', 'Italian', 'Chinese', 'Russian',
'German', 'Chinese', 'Spanish', 'English', 'French'
]
})
print (df)
passed_exam exam semester student
0 True French 1 a
1 False English 1 a
2 True Italian 2 a
3 False Chinese 2 b
4 True Russian 1 b
5 False German 1 b
6 True Chinese 2 c
7 False Spanish 2 c
8 True English 2 c
9 False French 2 c
有人知道如何找到每个学生(通过考试)互动的学生人数吗
大概是这样的:
passed_exam exam semester student total_st
0 True French 1 a 1
1 False English 1 a 1
2 True Italian 2 a 1
3 False Chinese 2 b 1
4 True Russian 1 b 1
5 False German 1 b 1
6 True German 2 c 2
7 False Spanish 2 c 2
8 True English 2 c 2
9 False French 2 c 2
提前谢谢你 我把“每个学生(通过考试)互动的学生人数”理解为参加同一考试的学生人数
那么,好像,
df1 = (df
.groupby(["exam","semester"], as_index=False)["student"].agg("count")
.rename(columns={"student":"total_st"}))
df.merge(df1).sort_values(["semester","student"])
passed_exam exam semester student total_st
0 True French 1 a 1
1 False English 1 a 1
5 True Russian 1 b 1
6 False German 1 b 1
2 True Italian 2 a 1
3 False Chinese 2 b 2
4 True Chinese 2 c 2
7 False Spanish 2 c 1
8 True English 2 c 1
9 False French 2 c 1
我理解你的问题的方式是,你希望“总数”列对应于学生在给定考试中与之互动的学生人数。例如,如果“法语”考试有4名学生(“a”、“b”、“c”、“d”),那么“a”学生与3名学生互动。我说得对吗 如果是这样,这里有一个解决方案。首先,让我们忘掉学期来简化问题,让我们考虑下面的例子:
df = pd.DataFrame({
'student': ['a'] * 3 + ['b'] * 3 + ['c'] * 4,
'exam': [
'Chinese', 'English', 'Spanish', 'Chinese', 'Spanish',
'Spanish', 'Chinese', 'Spanish', 'English', 'Chinese'
],
'passed_exam':[True, False] * 5
})
print(df)
exam passed_exam student
0 Chinese True a
1 English False a
2 Spanish True a
3 Chinese False b
4 Spanish True b
5 Spanish False b
6 Chinese True c
7 Spanish False c
8 English True c
9 Chinese False c
现在,我们可以使用groupby计算一个序列,该序列关联每次考试的学生人数:
d = df.groupby(['exam'])['student'].count()
print(d)
exam
Chinese 4
English 2
Spanish 4
Name: student, dtype: int64
我们通过对每个值减去1得到学生互动的学生人数:
d = d - 1
最后,我们使用apply创建“total_st”列,并将其分配给初始数据帧:
total_st = df.apply(lambda x: d.loc[x['exam']], axis=1)
df = df.assign(total_st=total_st)
print(df)
exam passed_exam student total_st
0 Chinese True a 3
1 English False a 1
2 Spanish True a 3
3 Chinese False b 3
4 Spanish True b 3
5 Spanish False b 3
6 Chinese True c 3
7 Spanish False c 3
8 English True c 1
9 Chinese False c 3
IIUC您可以这样做:
In [116]: df['total_st'] = df.groupby(['exam','semester'])['student'].transform('size')
In [117]: df
Out[117]:
passed_exam exam semester student total_st
0 True French 1 a 1
1 False English 1 a 1
2 True Italian 2 a 1
3 False Chinese 2 b 2
4 True Russian 1 b 1
5 False German 1 b 1
6 True Chinese 2 c 2
7 False Spanish 2 c 1
8 True English 2 c 1
9 False French 2 c 1
你的MCVE是混乱的:输入和输出之间的行是变化的,
total\u st
列是不可交换的(即b
与c
交互,但不是相反)。你如何想象在不同学期参加相同考试的学生之间的交互?你只需按考试和学期分组。如果你不在乎这学期是否不同,那就不要了。对不起,我表达得不够好!!最后一步略有不同。。我需要得到每个学生与之交互的学生数量。因此,学生a和b的行中的值应该是1,而c的行中的值应该是2。。因为学生C和两个学生都有共同的考试……如果你仔细看我给出的例子,它与你的稍有不同,你会发现我在做你所描述的;)我需要得到每个学生与之交互的学生数量。因此,学生a和b的行中的值应该是1,而c的行中的值应该是2。。因为学生C和两个学生都有共同的考试,我需要得到每个学生互动的学生人数。所以学生a和b的行中的值应该是1,而C的行中的值应该是2。。因为C学生和这两个学生有共同的考试students@Giada如果你关注这个学期,你会发现我提出的解决方案和马苏改进的解决方案都是正确的