首页 > 解决方案 > 根据具有数百万行的数据框中的匹配条件,更快地识别和比较行

问题描述

我有一个如下的数据框。

实际数据框

         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 列?

标签: pythonpandasdataframe

解决方案


这非常复杂,因为您想做很多不同的过滤器。如果我说对了,你想要

  1. 对于具有相同“日期”和“水果”值的行,以及
  2. 在这些行中,那些具有不同“level_0”值的行,以及
  3. 在这些行中,那些具有不同“Num”值的-NM。从您的示例中,您希望对“颜色”列执行相同的操作。
  4. 唯一出现“日期”和“水果”值的行得到-Miss.

首先,您需要创建Num一个字符串列,因为我们要添加后缀。然后我们 groupbyDateFruit(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)

然后,对于第二部分,我们在 和 中获取不重复的行DateFruit并添加-MissFruit列中。(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

推荐阅读