行和列之间的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如果你关注这个学期,你会发现我提出的解决方案和马苏改进的解决方案都是正确的