如何过滤掉pandas DF,并根据这些条件创建3个新的DF?

bvn4nwqk  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(146)

所以我有一个大的DF,结构如下:

name;id;value;source;date
john;id_123;33;A;2023-03-29
john;id_123;33;B;2023-03-29
peter;id_222;55;A;2023-03-30
peter;id_222;44;B;2023-03-30
mary;id_333;88;A;2023-30-30

我想过滤掉一些结果,并创建3个新的数据集。
1.从不同来源删除重复项。如果同一ID有多条记录,且日期相同,则只保留源B的记录。基于此过滤创建新DF。新的DF应该是这样的

name;id;value;source;date
 john;id_123;33;B;2023-03-29
 peter;id_222;44;B;2023-03-30
 mary;id_333;88;A;2023-30-30

2.约翰的例子:从不同来源删除重复项。如果有一个相同的ID,具有相同的值和相同的日期,但不同的来源,我想删除来源A,只留下来源B的行。然后创建一个新的DF,它将包含所有原始记录,减去源A的“john like”记录。新的DF应该看起来像这样:

name;id;value;source;date
john;id_123;33;B;2023-03-29
peter;id_222;55;A;2023-03-30
peter;id_222;44;B;2023-03-30
mary;id_333;88;A;2023-30-30

3.彼得的例子:查找符合以下条件的所有记录:相同的ID,相同的日期,不同的值。保留这两个记录。找到所有这些案例并从中创建一个新的DF。新的DF应该看起来像这样:

name;id;value;source;date
peter;id_222;55;A;2023-03-30
peter;id_222;44;B;2023-03-30
nukf8bse

nukf8bse1#

第一章
如果同一个ID有多条记录,且日期相同,则只保留源B的记录

cond1 = df.duplicated(['id', 'date'], keep=False)
cond2 = df['source'].ne('B')
df[~(cond1 & cond2)]

输出:

name    id      value   source  date
1   john    id_123  33      B       2023-03-29
3   peter   id_222  44      B       2023-03-30
4   mary    id_333  88      A       2023-30-30

我的天
如果有相同的ID,具有相同的值和相同的日期,但来源不同,只需保留来源B的行。

cond3 = df.duplicated(['id', 'value', 'date'], keep=False)
df[~(cond3 & cond2)]

输出

name    id      value   source  date
1   john    id_123  33      B       2023-03-29
2   peter   id_222  55      A       2023-03-30
3   peter   id_222  44      B       2023-03-30
4   mary    id_333  88      A       2023-30-30

三个人
相同的ID,相同的日期,不同的值。保留这两个记录。

df[cond1 & ~cond3]

输出:

name    id      value   source  date
2   peter   id_222  55      A       2023-03-30
3   peter   id_222  44      B       2023-03-30

相关问题