在Python中将重复的行从一列子集移动到另一个数据框

时间:2019-10-21 01:45:20

标签: python pandas

使用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

代码应检查每列中是否有重复行,并仅删除所有行中都发生重复的列。

  1. 在某些情况下,这些列都没有重复。
  2. 有时重复的次数不只是前三列。它应该检查所有列,因为在任何列中都可能发生重复

我该怎么办?

2 个答案:

答案 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:
nuniquedropna=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