Pandas 选择两个数据中较高的一个

Pandas 选择两个数据中较高的一个,pandas,dataframe,Pandas,Dataframe,我正在与Python Pandas合作,试图对一些学生测试数据进行排序。有时,学生会在同一个测试窗口中测试两次,我只想保存两次测试中最高的一次。下面是我的数据集的一个示例 姓名得分 爱丽丝32 爱丽丝75 约翰89 标记40 标记70 艾米60 有没有办法只为每个学生保留较高的分数?您可以使用groupby来实现这一点。它的工作原理如下: df.groupby('Name').agg({'Score': 'max'}) df.sort_values(['Name', 'Score']).dro

我正在与Python Pandas合作,试图对一些学生测试数据进行排序。有时,学生会在同一个测试窗口中测试两次,我只想保存两次测试中最高的一次。下面是我的数据集的一个示例

姓名得分
爱丽丝32
爱丽丝75
约翰89
标记40
标记70
艾米60


有没有办法只为每个学生保留较高的分数?

您可以使用
groupby
来实现这一点。它的工作原理如下:

df.groupby('Name').agg({'Score': 'max'})
df.sort_values(['Name', 'Score']).drop_duplicates(['Name'], keep='last')
其结果是:

       Score
Name        
Alice     75
Amy       60
John      89
Mark      70
顺便说一句,在这种特殊设置中,您还可以使用
删除重复项
在分数排序后使名称唯一。这将产生相同的结果,但不可扩展(例如,如果以后要添加平均分数等)。它看起来是这样的:

df.groupby('Name').agg({'Score': 'max'})
df.sort_values(['Name', 'Score']).drop_duplicates(['Name'], keep='last')
根据您发布的测试数据:

import pandas as pd
from io import StringIO

sio= StringIO("""Name Score
Alice 32
Alice 75
John 89
Mark 40
Mark 70
Amy 60 """)

df= pd.read_csv(sio, sep='\s+')

您可以使用
groupby
执行此操作。它的工作原理如下:

df.groupby('Name').agg({'Score': 'max'})
df.sort_values(['Name', 'Score']).drop_duplicates(['Name'], keep='last')
其结果是:

       Score
Name        
Alice     75
Amy       60
John      89
Mark      70
顺便说一句,在这种特殊设置中,您还可以使用
删除重复项
在分数排序后使名称唯一。这将产生相同的结果,但不可扩展(例如,如果以后要添加平均分数等)。它看起来是这样的:

df.groupby('Name').agg({'Score': 'max'})
df.sort_values(['Name', 'Score']).drop_duplicates(['Name'], keep='last')
根据您发布的测试数据:

import pandas as pd
from io import StringIO

sio= StringIO("""Name Score
Alice 32
Alice 75
John 89
Mark 40
Mark 70
Amy 60 """)

df= pd.read_csv(sio, sep='\s+')

这个问题已经在StackOverflow上得到了回答

您可以合并两个数据帧,然后计算每行的最大数量。df1和df2是学生得分的大熊猫:

import pandas as pd
df1 = pd.DataFrame({'Alice': 3,
                    'John': 8,
                    'Mark': 7.5,
                    'Amy': 0},
                    index=[0])

df2 = pd.DataFrame({'Alice': 7,
                    'Mark': 7},
                    index=[0])

result = pd.concat([df1, df2], sort=True)
result = result.T
result["maxvalue"] = result.max(axis=1)

这个问题已经在StackOverflow上得到了回答

您可以合并两个数据帧,然后计算每行的最大数量。df1和df2是学生得分的大熊猫:

import pandas as pd
df1 = pd.DataFrame({'Alice': 3,
                    'John': 8,
                    'Mark': 7.5,
                    'Amy': 0},
                    index=[0])

df2 = pd.DataFrame({'Alice': 7,
                    'Mark': 7},
                    index=[0])

result = pd.concat([df1, df2], sort=True)
result = result.T
result["maxvalue"] = result.max(axis=1)

如果您的数据在dataframe
df
中,您可以按分数按递减顺序排序,并删除重复的名称,保留第一个:

df.sort_values(by='Score', ascending=False).drop_duplicates(subset='Name', keep='first')

如果您的数据在dataframe
df
中,您可以按分数按递减顺序排序,并删除重复的名称,保留第一个:

df.sort_values(by='Score', ascending=False).drop_duplicates(subset='Name', keep='first')

有多种方法可以做到这一点,其中两种是:

[8]中的
:df=pd.DataFrame({“Score”:[32,75,89,40,70,60],
…:“姓名”:[“爱丽丝”、“爱丽丝”、“约翰”、“马克”、“马克”、“艾米”]})
…:df
出[8]:
分数名
0 32爱丽丝
175爱丽丝
289约翰
340马克
470马克
560艾米
在[13]:%time df.groupby(“Name”).max()中
CPU时间:用户2.26毫秒,系统:286微秒,总计:2.54毫秒
壁时间:2.11毫秒
出[13]:
分数
名称
爱丽丝75
艾米60
约翰89
马克70
在[14]:%time-df.sort\u值(“Name”).drop\u重复项(subset=“Name”,keep=“last”)
CPU时间:用户2.25毫秒,系统:0纳秒,总计:2.25毫秒
壁时间:1.89毫秒
出[14]:
分数名
175爱丽丝
560艾米
289约翰
470马克

有多种方法可以做到这一点,其中两种是:

[8]中的
:df=pd.DataFrame({“Score”:[32,75,89,40,70,60],
…:“姓名”:[“爱丽丝”、“爱丽丝”、“约翰”、“马克”、“马克”、“艾米”]})
…:df
出[8]:
分数名
0 32爱丽丝
175爱丽丝
289约翰
340马克
470马克
560艾米
在[13]:%time df.groupby(“Name”).max()中
CPU时间:用户2.26毫秒,系统:286微秒,总计:2.54毫秒
壁时间:2.11毫秒
出[13]:
分数
名称
爱丽丝75
艾米60
约翰89
马克70
在[14]:%time-df.sort\u值(“Name”).drop\u重复项(subset=“Name”,keep=“last”)
CPU时间:用户2.25毫秒,系统:0纳秒,总计:2.25毫秒
壁时间:1.89毫秒
出[14]:
分数名
175爱丽丝
560艾米
289约翰
470马克

你不能对两列上的值进行
排序吗?你不能对两列上的值进行
排序吗?什么是
df
df1
df2
,这应该如何工作?df1和df2是两个熊猫数据框架,它们是
df
df1
df2
这应该是如何工作的?df1和df2是两个熊猫数据框架我感谢您的编辑,但除了排序顺序,它正是我的答案所建议的:也许这是因为它很简单。我们可能不会被提名诺贝尔奖,对吗?顺便说一句,我还没有看到你的帖子。它在哪里?别紧张。这并不意味着冒犯。:)考虑到你的最后一个问题:我不知道你打字有多快我感谢您的编辑,但除了排序顺序,这正是我的答案所建议的。:)也许这是因为它很简单。我们可能不会被提名诺贝尔奖,对吗?顺便说一句,我还没有看到你的帖子。它在哪里?别紧张。这并不意味着冒犯。:)考虑到你的最后一个问题:我不知道你打字有多快