从df开始,我要删除行,如下所示:对于每个ID
,请检查是否至少一次COD1
= COD2
,并且GRADE
是否包含字符串'A'
或'C'
。如果满足这两个条件,则删除行。
我的想法是把我的情况放在这样:
indexNames = df[ (df[df.COD1 == df.COD2]) & (df[df['Grade'].isin(['A','C'])]) ].index
然后使用
df.drop(indexNames , inplace=True)
但是对于第一行,我得到TypeError: unsupported operand type(s) for &: 'int' and 'float'
。
我非常感谢关于实现目标的任何想法。 我的df:
# -- create a dataframe
list_columns = ['ID', 'COD1', 'COD2','Grade','Data']
list_data = [
[3215575, 'A21', 'A21','A','2020-09-16 13:25:00'],
[3215575, 'A11', 'A21','D','2020-09-16 13:55:00'],
[3215575, 'A21', 'A21','E','2020-09-16 13:12:00'],
[4058770, 'D10', '213','E','2020-09-16 12:25:00'],
[4058770, '313', '313','E','2020-09-16 10:25:00'],
[4058770, '313', '125','B','2020-09-16 13:19:00'],
[4058771, 'C55', 'C55','C','2020-09-16 14:25:00'],
[3215577, 'A21', 'A21','B','2020-09-16 13:25:00'],
[3215577, 'A01', 'A21','D','2020-09-16 13:55:00']
]
df = pd.DataFrame(columns=list_columns, data=list_data)
预期输出:
list_columns = ['ID', 'COD1', 'COD2','Grade','Data']
list_data = [
[4058770, 'D10', '213','E','2020-09-16 12:25:00'],
[4058770, '313', '313','E','2020-09-16 10:25:00'],
[3215577, 'A21', 'A21','B','2020-09-16 13:25:00'],
[3215577, 'A01', 'A21','D','2020-09-16 13:55:00']
]
df2 = pd.DataFrame(columns=list_columns, data=list_data)
答案 0 :(得分:0)
IIUC,您需要一个条件,使用groupby并使用any进行转换,然后取反:
cond = (df.COD1 == df.COD2) & df['Grade'].isin(['A','C'])
df2 = df[~cond.groupby(df['ID']).transform('any')].reset_index(drop=True)
ID COD1 COD2 Grade Data
0 4058770 D10 213 E 2020-09-16 12:25:00
1 4058770 313 313 E 2020-09-16 10:25:00
2 4058770 313 125 B 2020-09-16 13:19:00
3 3215577 A21 A21 B 2020-09-16 13:25:00
4 3215577 A01 A21 D 2020-09-16 13:55:00