首页 > 解决方案 > 通过 value_counts() 将数据帧划分为两个 DF

问题描述

我的框架:

name    rs      number
11      5566     64882
41      534326   5345
11      5566     3312
44      2341     5553
1       6223     2333

它有 700k+ 行。

df.rs.value_counts() = 

5566 2
534326 1
2341 1
6223 1

我需要通过 value_counts 将该帧分配给其他 2 个较小的帧。我的意思是: inUniqueDF应该只有没有 rs 重复的行:

    name    rs      number
    41      534326   5345
    44      2341     5553
    1       6223     2333

并且 inDuplicatedDF应该只是重复(所有重复的行,因为 rs 可能相同,但另一个 cols 具有不同的值):

name    rs      number
11      5566     64882
11      5566     3312

我试过这样的事情:

Duplicate_rs_df = df.drop(df.index[np.where(df.rs.value_counts() <1)])

unique1 = df.drop(df.index[np.where(df.rs.value_counts() >1)])

但是,当我通过 couts_values 检查 dfs 时,两者仍然有重复。我的代码有什么问题,我该如何以更好的方式做到这一点?

标签: pythonpandasdataframe

解决方案


使用pandas.DataFrame.drop_duplicates和:duplicated _keep=False

给定df

   name      rs  number
0    11    5566   64882
1    41  534326    5345
2    11    5566    3312
3    44    2341    5553
4     1    6223    2333

使用drop_duplicates

uniq_df = df.drop_duplicates('rs', False)
print(uniq_df)

   name      rs  number
1    41  534326    5345
3    44    2341    5553
4     1    6223    2333

并使用duplicated

dup_df = df[df.duplicated('rs', False)]
print(dup_df)

   name    rs  number
0    11  5566   64882
2    11  5566    3312

甚至更简单,df.duplicated('rs', False)仅使用:

ind = df.duplicated('rs', False)
print(df[~ind])

   name      rs  number
1    41  534326    5345
3    44    2341    5553
4     1    6223    2333

print(df[ind])
   name    rs  number
0    11  5566   64882
2    11  5566    3312

推荐阅读