我有一个包含以下列和行的dataframe:
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,例如:
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:
NJ yes no no 5/31/21
NJ yes no no 5/31/21案例2:
NY no yes NULL 6/1/21
NY no yes NULL 6/1/21案例3:
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我能够解决前两个案例:
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我不确定如何处理第三种情况,我刚接触熊猫数据框架,任何帮助都将不胜感激。
发布于 2021-06-03 20:36:35
也许这就是你要找的?
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()```发布于 2021-06-03 21:49:41
如果我正确理解了这个问题,我认为您可以通过创建两个临时数据帧来实现您的目标,这两个数据帧分别用“yes”和“no”替换为“NULL”。然后,您可以根据重复项进行过滤。
最小示例:
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()]提供以下输出:
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/21https://stackoverflow.com/questions/67821283
复制相似问题