python - 根据具有数百万行的数据框中的匹配条件,更快地识别和比较行
问题描述
我有一个如下的数据框。
Date Fruit level_0 Num Color
0 2013-11-25 Apple DF2 22.1 Red
1 2013-11-24 Banana DF1 22.1 Yellow
2 2013-11-24 Banana DF2 122.1 Yellow
3 2013-11-23 Celery DF1 10.2 Green
4 2013-11-24 Orange DF1 8.6 Orange
5 2013-11-24 Orange DF2 8.6 Orange1
6 2013-11-25 Orange DF1 8.6 Orange
我需要查找并比较数据框中的行,并查看哪些列存在数据不匹配。选择进行比较的行应该只有那些“日期”和“水果”值相同但“级别_0”值不同的行。因此,在数据框中,我需要比较具有索引 1 和 2 的行,因为它们具有相同的“日期”和“水果”值,但不同的“level_0”值。在比较这些时,因为它们在“Num”列中不同,我们需要在两行中的值旁边添加一个标签(比如“NM”)。仅出现一次“日期”和“水果”组合的行需要在“水果”列中的值后面加上一个标签(比如“小姐”)。
下面的预期输出示例:
1.)是否有可能得到这样的输出?2.)有没有一种快速的方法,因为我的实际数据集包含数百万行和 20-25 列?
解决方案
这非常复杂,因为您想做很多不同的过滤器。如果我说对了,你想要
- 对于具有相同“日期”和“水果”值的行,以及
- 在这些行中,那些具有不同“level_0”值的行,以及
- 在这些行中,那些具有不同“Num”值的行
-NM
。从您的示例中,您希望对“颜色”列执行相同的操作。 - 唯一出现“日期”和“水果”值的行得到
-Miss
.
首先,您需要创建Num
一个字符串列,因为我们要添加后缀。然后我们 groupbyDate
和Fruit
(1)。然后,由于您希望这些组具有不同的值,因此我们在称为(2)level_0
的基础上进行过滤。diff_frames
然后,如果它们有两个唯一元素 (3),我们在两列上使用变换添加后缀。
df['Num'] = df['Num'].astype(str)
g = df.groupby(['Date', 'Fruit'])
diff_frames = g['level_0'].transform(lambda s: s.nunique() == 2)
df[['Num', 'Color']] = df[diff_frames].groupby(['Date', 'Fruit'])[['Num', 'Color']].transform(
lambda s: s+'-NM' if s.nunique() == 2 else s)
然后,对于第二部分,我们在 和 中获取不重复的行Date
,Fruit
并添加-Miss
到Fruit
列中。(4)
df.loc[~df.duplicated(subset=['Date', 'Fruit'], keep=False), 'Fruit'] += '-Miss'
print(df)
Date Fruit level_0 Num Color
0 0 Apple-Miss DF2 22.1 Red
1 1 Banana DF1 22.1-NM Yellow
2 1 Banana DF2 122.1-NM Yellow
3 2 Celery-Miss DF1 10.2 Green
4 3 Orange DF1 8.6 Orange-NM
5 3 Orange DF2 8.6 Orange1-NM
6 4 Orange-Miss DF2 8.6 Orange
推荐阅读
- javascript - 如何从反应连接到谷歌云存储并获取私有对象
- python - 在 python IDLE 中没有得到程序输出
- json - 我怎样才能弄清楚一个文本文件是用什么压缩的?
- laravel - 如果用户不存在,我如何从用户表中检索用户信息并处理错误?
- python - 将numpy数组转换为numpy列python
- xamarin - 如何在 Xamarin 表单 ContentPage IconImageSource 中显示图像
- python - Python - 将同一标题下的每个列表数据的新行写入csv
- html - 为什么 CSS 不会更改 HTML 部分元素?
- objective-c - 来自 NSMenuItem (Button) 的 NSPopover 不接受鼠标事件
- javascript - jsx内部的异步函数调用