使用Python和Pandas,我想找到一个数据框中具有重复行的所有列,并将它们移到另一个数据框中。 例如,我可能有:
cats, tigers, 3.5, 1, cars, 2, 5
cats, tigers, 3.5, 6, 7.2, 22.6, 5
cats, tigers, 3.5, test, 2.6, 99, 52.3
我想要猫,老虎,3.5个数据框
cats, tigers, 3.5
在我想要的另一个数据框中
1, cars, 2, 5
6, 7.2, 22.6, 5
test, 2.6, 99, 52.3
代码应检查每列中是否有重复行,并仅删除所有行中都发生重复的列。
我该怎么办?
答案 0 :(得分:1)
您可以使用
df1 = pd.DataFrame(df.val.str.extract('([a-zA-Z ]+)', expand=False).str.strip().drop_duplicates()) #'val' is the column in which you have these values
print(df1)
输出
val
0 ABCD
和
df2 = pd.DataFrame(df.val.str.extract('([0-9]+)', expand=False).str.strip().drop_duplicates()) #'val' is the column in which you have these values
print(df2)
输出
val
0 1234
1 6578
2 4432
答案 1 :(得分:1)
方法1:
将nunique
与dropna=False
m = df.nunique(dropna=False).eq(1)
df_dup = df.iloc[[0], m.values]
Out[121]:
0 1 2
0 cats tigers 3.5
df_notdup = df.loc[:, ~m]
Out[123]:
3 4 5 6
0 1 cars 2.0 5.0
1 6 7.2 22.6 5.0
2 test 2.6 99.0 52.3
方法2:
使用listcomp并在每个列上使用选项duplicated
检查keep=False
并检查all
m = np.array([df[x].duplicated(keep=False).all() for x in df])
df_dup = df.loc[:, m]
Out[65]:
0 1 2
0 cats tigers 3.5
1 cats tigers 3.5
2 cats tigers 3.5
如@Moys所述,如果您只想在df_dup
中排一行,则可以使用drop_duplicates
或仅使用.head(1)
或iloc
df_dup = df.loc[:, m].head(1)
或
df_dup = df.iloc[[0], m]
Out[91]:
0 1 2
0 cats tigers 3.5
对于非重复行:
df_notdup = df.loc[:, ~m]
Out[75]:
3 4 5 6
0 1 cars 2.0 5.0
1 6 7.2 22.6 5.0
2 test 2.6 99.0 52.3