首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas Dataframe:根据条件查找重复行

Pandas Dataframe:根据条件查找重复行
EN

Stack Overflow用户
提问于 2021-06-03 20:13:42
回答 2查看 114关注 0票数 2

我有一个包含以下列和行的dataframe:

代码语言:javascript
运行
复制
    State   Rain    Sun     Snow    Day
1   NJ      yes     no      no      5/31/21
2   NJ      yes     no      no      6/1/21
3   NJ      yes     no      no      6/2/21
4   NJ      yes     no      no      6/3/21
5   NY      no      no      yes     5/31/21
6   NY      no      yes     NULL    6/1/21
7   NY      no      yes     NULL    6/2/21
8   NY      no      yes     NULL    6/3/21
9   IL      no      yes     no      5/31/21
10  IL      no      yes     no      6/1/21
11  IL      no      yes     no      6/2/21
12  IL      yes     no      no      6/3/21
13  FL      no      yes     no      5/31/21
14  FL      yes     no      NULL    6/1/21
15  FL      yes     NULL    NULL    6/2/21
16  FL      NULL    NULL    NULL    6/3/21

在这里,Rain、Sun和Snow列可以为空值,但其他列不能为空值。此外,如果Rain列为null,则Sun和Snow列也将为NULL,例如:

代码语言:javascript
运行
复制
NJ NULL NULL  NULL 5/31/21 -> Valid
NJ no   yes   NULL 5/31/21 -> Valid
NJ yes  NULL  NULL 5/31/21 -> Valid
NJ NULL yes   no   5/31/21 -> Invalid
NJ yes  NULL  no   5/31/21 -> Invalid
NJ NULL NULL  no   5/31/21 -> Invalid

我希望在此数据集中查找重复项,但具有一定的条件,并返回重复项的索引。以下情况应视为重复:

案例1:

代码语言:javascript
运行
复制
NJ      yes     no      no      5/31/21
NJ      yes     no      no      5/31/21

案例2:

代码语言:javascript
运行
复制
NY      no      yes     NULL    6/1/21
NY      no      yes     NULL    6/1/21

案例3:

代码语言:javascript
运行
复制
FL      no      no      no      6/1/21
FL      no      no      NULL    6/1/21
FL      no      NULL    NULL    6/1/21
FL      NULL    NULL    NULL    6/1/21

我能够解决前两个案例:

代码语言:javascript
运行
复制
    def find_duplicates(df: pd.DataFrame):
        dup_rows = df.duplicated(subset=['State', 'Rain', 'Sun', 'Snow', 'Day'], keep=False)
        dup_df = df[dup_rows]
        dup_df = dup_df.reset_index()
        dup_df.rename(columns={'index': 'row'}, inplace=True)
        group = dup_df.groupby(['State', 'Rain', 'Sun', 'Snow', 'Day'], dropna=False)
        dup_lst = [grp['row'].to_list() for ind, grp in group]
        return dup_lst

我不确定如何处理第三种情况,我刚接触熊猫数据框架,任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-03 20:36:35

也许这就是你要找的?

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd


def colwise_dups(df, cols):
    return df[
        np.array(
            [
                (row.drop(index=cols).values == df.drop(columns=cols).values).all(
                    axis=1
                )
                for _, row in df[
                    (df[cols] == ["NULL"] * len(cols)).all(axis=1)
                ].iterrows()
            ]
        ).any(axis=0)
    ]


cols = []
duplicates = pd.DataFrame()
for col in ["Rain", "Sun", "Snow"][::-1]:
    cols.append(col)
    duplicates = pd.concat([duplicates, colwise_dups(df, cols)]).drop_duplicates()```
票数 0
EN

Stack Overflow用户

发布于 2021-06-03 21:49:41

如果我正确理解了这个问题,我认为您可以通过创建两个临时数据帧来实现您的目标,这两个数据帧分别用“yes”和“no”替换为“NULL”。然后,您可以根据重复项进行过滤。

最小示例:

代码语言:javascript
运行
复制
df = pd.DataFrame({'State': 'NJ NJ NY NY FL FL FL FL'.split(' '),
              'Rain': 'yes yes no no no no no NULL'.split(' '),
              'Sun': 'no no yes yes no no NULL NULL'.split(' '),
              'Snow': 'no no NULL NULL no NULL NULL NULL'.split(' '),
              'Day': '5/31/21 5/31/21 6/1/21 6/1/21 6/1/21 6/1/21 6/1/21 6/1/21' .split(' ')})

tmp = df.replace('NULL', 'no')
tmp2 = df.replace('NULL', 'yes')

df[~tmp.duplicated() & ~tmp2.duplicated()]

提供以下输出:

代码语言:javascript
运行
复制
  State Rain  Sun  Snow      Day
0    NJ  yes   no    no  5/31/21
2    NY   no  yes  NULL   6/1/21
4    FL   no   no    no   6/1/21
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67821283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档