我有一张桌子:
name signature
XXX DA
XXX DB
XXX DC
YYY DA
YYY DB
YYY DC
XXX DA
XXX DE
CCC AA
CCC AB
U可以看到我在表中有重复-名称col是用户的名称。签名是代码。我需要从此数据帧中删除,并将所有重复放入临时数据帧,但在特殊条件下。
如果在数据帧中重复name
和signature
-所有具有重复的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有一个我找不到的更快的方法。有人可以帮我解决这个问题吗?
答案 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