Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于不相关列的唯一性查找两列的并集_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于不相关列的唯一性查找两列的并集

Python 基于不相关列的唯一性查找两列的并集,python,pandas,dataframe,Python,Pandas,Dataframe,我试图确定每个学生在面对面的基础上,他们所上的课程和完成的项目的表现 scores.csv: 我最终会自己做来分析,但首先使用pd.merge是非常慢的,特别是如果有10个成千上万的唯一学生ID 有没有更有效的方法?我尝试过使用pivot table,但可能我用这种方法找错了方向。我认为使用pivot table要快一点: 不带连接列的合并的解决方案,以及: 谢谢你的回答@jezrael,但我如何才能使用每组?有没有一种方法可以将组存储在字典中而不是打印出来?我试图用一种类似的方法来计算每组的帖

我试图确定每个学生在面对面的基础上,他们所上的课程和完成的项目的表现

scores.csv:

我最终会自己做
来分析
,但首先使用
pd.merge
是非常慢的,特别是如果有10个成千上万的唯一学生ID


有没有更有效的方法?我尝试过使用pivot table,但可能我用这种方法找错了方向。

我认为使用pivot table要快一点:

不带连接列的合并的解决方案,以及:


谢谢你的回答@jezrael,但我如何才能使用每组?有没有一种方法可以将组存储在字典中而不是打印出来?我试图用一种类似的方法来计算每组的帖子数量:
df.groupby('student\u id').transform(lambda x:pd.merge(df,x['class\u id','project\u id']])['posts'].sum()
,但它不起作用。我认为你真的很接近了-需要
apply
-
df1=df.groupby('student\u id').apply(lambda x:pd.merge(df,x)[['class\u id','project\u id']]].['posts'].sum())
和for dict
df1=df.groupby('student\u id')。应用(lambda x:pd.merge(df,x['class\u id','project\u id']])。to\u dict()。
(可能最后一次
to\u dict
可以删除,这取决于您想要什么)
import pandas as pd
df = pd.read_csv("Documents/scores.csv")

student_ids = df.student_id.unique()

for id in student_ids:
    to_analyse = pd.merge(df,df[df['student_id'] == id][['class_id','project_id']])
def f(x):
    print (pd.merge(df, x[['class_id','project_id']]))

df = df.groupby('student_id').apply(f)
df['both'] = df['class_id'].astype(str)  + '_' + df['project_id'].astype(str)

def f(x):
    print (df[df['both'].isin(x['both'])])

df = df.groupby('student_id').apply(f).drop('both', axis=1)