Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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_Python 3.x_Pandas - Fatal编程技术网

Python 排序/选择唯一和最新的数据

Python 排序/选择唯一和最新的数据,python,python-3.x,pandas,Python,Python 3.x,Pandas,我试图从我的数据中获取最相关的值。我想用pandas中的max和min函数获取最早和最新的日期,但我找不到对其余日期的修复。我正试图从我的数据集中选取一家unqiue公司和产品,并根据这些点获取他们的其余数据。如果有人能告诉我python中用于解决此类问题的工具集,这些工具集将非常有用,或者可以指导python如何解决此类问题,那将非常有用 对于安全级别,超级服务器>严重>中等>材料>次要 对于评级,如果我们看到同一家公司和同一产品的评级同时为真和假,则为真 对于等级等级,临界>高>中>低 对

我试图从我的数据中获取最相关的值。我想用pandas中的max和min函数获取最早和最新的日期,但我找不到对其余日期的修复。我正试图从我的数据集中选取一家unqiue公司和产品,并根据这些点获取他们的其余数据。如果有人能告诉我python中用于解决此类问题的工具集,这些工具集将非常有用,或者可以指导python如何解决此类问题,那将非常有用

  • 对于安全级别,超级服务器>严重>中等>材料>次要
  • 对于评级,如果我们看到同一家公司和同一产品的评级同时为真和假,则为真
  • 对于等级等级,临界>高>中>低
  • 对于第一个版本,最早的日期;对于最后一个版本,最新的日期
  • 分数,同一产品和公司中的最高分数
公司 产品 安全级别 评级 评级水平 首次发布 最后发布 分数 谷歌 可移动的 少数的 真的 批评的 04/11/2020 03/17/2020 0.5 谷歌 操作系统 适度的 错误的 中等的 09/05/2019 03/20/2021 0.009 谷歌 操作系统 少数的 错误的 低的 09/04/2019 05/11/2020 19 谷歌 电视 严峻的 真的 高的 08/11/2020 03/04/2021 谷歌 可移动的 超严重 错误的 中等的 04/06/2015 08/19/2020 2.4 谷歌 可移动的 少数的 错误的 高的 08/08/2019 08/19/2020 1.3 苹果 苹果手机 少数的 真的 低的 02/03/2020 10/13/2020 3. 苹果 苹果手机 材料 真的 中等的 01/21/2018 03/04/2021 6. 苹果 iwatch 材料 错误的 低的 04/11/2015 08/13/2020 8. 苹果 苹果手机 材料 真的 中等的 10/20/2020 03/19/2021 5. 戴尔 笔记本电脑 少数的 错误的 低的 01/05/2021 03/20/2021 1.
正如您的问题所述,排序,然后选择每组的第一行。您已经定义了按类别排序

nan = np.nan
df = pd.DataFrame({'company': ['google', 'google', 'google', 'google', 'google', 'google', 'apple', 'apple', 'apple', 'apple', 'dell'], 
              'product': ['mobile', 'os', 'os', 'tv', 'mobile', 'mobile', 'iphone', 'iphone', 'iwatch', 'iphone', 'laptop'], 
              'security_level': ['minor', 'moderate', 'minor', 'severe', 'supersevere', 'minor', 'minor', 'material', 'material', 'material', 'minor'], 
              'rating': [True, False, False, True, False, False, True, True, False, True, False], 
              'rating_level': ['critical', 'medium', 'low', 'high', 'medium', 'high', 'low', 'medium', 'low', 'medium', 'low'], 
              'first_release': ['04/11/2020', '09/05/2019', '09/04/2019', '08/11/2020', '04/06/2015', '08/08/2019', '02/03/2020', '01/21/2018', '04/11/2015', '10/20/2020', '01/05/2021'], 
              'last_release': ['03/17/2020', '03/20/2021', '05/11/2020', '03/04/2021', '08/19/2020', '08/19/2020', '10/13/2020', '03/04/2021', '08/13/2020', '03/19/2021', '03/20/2021'], 
              'score': [0.5, 0.009, 19.0, nan, 2.4, 1.3, 3.0, 6.0, 8.0, 5.0, 1.0]})

# fix data types of columns.  Categoricals for sort orders
df.first_release = pd.to_datetime(df.first_release)
df.last_release = pd.to_datetime(df.last_release)
df.security_level = pd.Categorical(df.security_level, ['supersevere','severe','material','moderate','minor'], ordered=True)
df.rating_level = pd.Categorical(df.rating_level, ['critical', 'high', 'medium', 'low', ], ordered=True)

dfs = df.sort_values(['company', 'product', 'security_level', 'rating', 'rating_level','first_release', 'last_release'],
              ascending=[1,1,1,0,1,0,1])



使用所有规则进行排序后 公司 产品 安全级别 评级 评级水平 首次发布 最后发布 分数 9 苹果 苹果手机 材料 真的 中等的 2020-10-20 00:00:00 2021-03-19 00:00:00 5. 7. 苹果 苹果手机 材料 真的 中等的 2018-01-21 00:00:00 2021-03-04 00:00:00 6. 6. 苹果 苹果手机 少数的 真的 低的 2020-02-03 00:00:00 2020-10-13 00:00:00 3. 8. 苹果 iwatch 材料 假的 低的 2015-04-11 00:00:00 2020-08-13 00:00:00 8. 10 戴尔 笔记本电脑 少数的 假的 低的 2021-01-05 00:00:00 2021-03-20 00:00:00 1. 4. 谷歌 可移动的 超严重 假的 中等的 2015-04-06 00:00:00 2020-08-19 00:00:00 2.4 0 谷歌 可移动的 少数的 真的 批评的 2020-04-11 00:00:00 2020-03-17 00:00:00 0.5 5. 谷歌 可移动的 少数的 假的 高的 2019-08-08 00:00:00 2020-08-19 00:00:00 1.3 1. 谷歌 操作系统 适度的 假的 中等的 2019-09-05 00:00:00 2021-03-20 00:00:00 0.009 2. 谷歌 操作系统 少数的 假的 低的 2019-09-04 00:00:00 2020-05-11 00:00:00 19 3. 谷歌 电视 严峻的 真的 高的 2020-08-11 00:00:00 2021-03-04 00:00:00 楠 公司 产品 安全级别 评级 评级水平 首次发布 最后发布 分数
first\u release
last\u release
列的
dtype
更改为
datetime

df['last_release']  = pd.to_datetime(df['last_release'])
df['first_release'] = pd.to_datetime(df['first_release'])
将列
security\u level
rating\u level
转换为
ordered
分类类型

df['rating_level'] = pd.Categorical(df['rating_level'], ['low', 'medium', 'high', 'critical'], ordered=True)
df['security_level'] = pd.Categorical(df['security_level'], ['minor', 'material', 'moderate', 'severe', 'supersevere'], ordered=True)
Group
对列
company
product
上的数据框进行分组,并使用
agg\u dict

agg_dict = {'security_level': 'max', 'rating': 'max', 'rating_level': 'max',
            'first_release': 'min', 'last_release': 'max', 'score': 'max'}
            
out = df.groupby(['company', 'product'], as_index=False, sort=False).agg(agg_dict)
结果

>>> out

  company product security_level  rating rating_level first_release last_release  score
0  google  mobile    supersevere    True     critical    2015-04-06   2020-08-19    2.4
1  google      os       moderate   False       medium    2019-09-04   2021-03-20   19.0
2  google      tv         severe    True         high    2020-08-11   2021-03-04    NaN
3   apple  iphone       material    True       medium    2018-01-21   2021-03-19    6.0
4   apple  iwatch       material   False          low    2015-04-11   2020-08-13    8.0
5    dell  laptop          minor   False          low    2021-01-05   2021-03-20    1.0

谢谢你的回复!但如果我的数据设置了更多的数据而不是“谷歌”或“苹果”呢。我正在寻找一个通用的解决方案,可以使用,无论公司或产品名称你反复问同样的问题-这不是一个好主意。我已经更新了,分类定义数据的排序顺序现在包括在内。字典(agg_dict)如何区分或帮助排序,在我看来,agg_dict就像字典格式的一堆字符串?请您解释一下,片段
agg_dict
是从
column name
到相应的聚合函数(如
max
)的映射,该函数选择应用它的列中每个组的最大值。{'id':'max'}这是否表示我们要在id中取最大值,我的印象是,字典不识别最大/最小关键字,它们将所有内容都视为字符串是我的假设。你是对的,字典不识别这些关键字,对于dictionary,这些只是字符串,但当您将此dictionary传递给pandas groupby对象的
agg
方法时,pandas会将这些特殊名称识别为聚合函数。