从熊猫数据框中提取重复

时间:2019-06-07 07:38:17

标签: python pandas dataframe

我有一张桌子:

name       signature
XXX          DA
XXX          DB
XXX          DC
YYY          DA
YYY          DB
YYY          DC
XXX          DA
XXX          DE
CCC          AA
CCC          AB

U可以看到我在表中有重复-名称col是用户的名称。签名是代码。我需要从此数据帧中删除,并将所有重复放入临时数据帧,但在特殊条件下。

如果在数据帧中重复namesignature-所有具有重复的name的记录都应删除并放入另一个数据帧。

因此,根据上面的数据框,new_data应该为:

   name       signature
    YYY          DA
    YYY          DB
    YYY          DC
    CCC          AA
    CCC          AB

以及具有重复值的新数据框:

   name       signature
    XXX          DA
    XXX          DB
    XXX          DC
    XXX          DA
    XXX          DE

我该怎么办?我在google和SO中寻找好的建议,但没有发现任何帮助。

我是for loop刚做的,但是问题是很大。我的dataFrame有15000000条记录。所以我需要做得更快。可以肯定的是,pandas或python有一个我找不到的更快的方法。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

使用DataFrame.duplicated获取重复的name,并用Series.isin过滤boolean indexing的原始DataFrame作为成员:

vals = df.loc[df.duplicated(['name','signature']), 'name'].unique()
mask = df['name'].isin(vals)

df1 = df[~mask]
df2 = df[mask]

print (df1)
  name signature
3  YYY        DA
4  YYY        DB
5  YYY        DC
8  CCC        AA
9  CCC        AB

print (df2)
  name signature
0  XXX        DA
1  XXX        DB
2  XXX        DC
6  XXX        DA
7  XXX        DE

答案 1 :(得分:1)

我想到了一个可行的解决方案,不确定是否理想,但是您可以尝试运行它,看看是否可以节省时间。

# Assuming df_val is your dataframe
print df_val
#create a column over name and signature to count over 
df_val["combined_index_column"] = df_val.apply(lambda x:x["name"]+","+x["signature"], axis=1)
#generate counts of unique rows
df_val["counter_index"] = df_val["combined_index_column"].apply(lambda x:df_val["combined_index_column"].tolist().count(x))
#generate list of names with duplicate rows
duplicate_name_list = df_val[df_val["counter_index"]>1]["name"].unique().tolist()
#get dataframe with repetition
dataframe_with_repetition = df_val[df_val["name"].isin(duplicate_name_list)][["name", "signature"]]
#get dataframe without repetition
dataframe_without_repetition = df_val[~df_val["name"].isin(duplicate_name_list)][["name", "signature"]]
print dataframe_with_repetition
print dataframe_without_repetition