【问题标题】:remove rows with duplicated values of two columns that are shifted in pandas data frame?删除在熊猫数据框中移动的两列重复值的行?
【发布时间】:2023-03-05 05:52:02
【问题描述】:

我有以下数据框:

import pandas as pd

data = [['1044', '1924'], ['1044', '1926'], ['1044', '1927'], ['1044', '1928'], ['1048', '1924'], ['1048', '1926'], ['1048', '1927'], ['1048', '1928'], ['1051', '1924'], ['1051', '1926'], ['1051', '1927'], ['1051', '1928'], ['1058', '']]  
df = pd.DataFrame(data, columns = ['Col1', 'Col2']) 

我想减少数据框,如下所示:

我不知道该怎么做,但它应该如下工作:

  • 将第一个副本保留在“日期”列中 - 在本示例中为第 0 行
  • 在“值”列中删除第二个重复项 - 在本示例中为第 3 行

希望它确实存在一种更简单的方法来执行它。

【问题讨论】:

  • 你可以建立一个新的数据框:pd.DataFrame({key:pd.unique(value) for key, value in df.items()})
  • 完美运行。谢谢你。如何在上面的代码中定义这两列?
  • @sammywemmy 聪明人,你应该把它作为答案发布;)

标签: pandas duplicates


【解决方案1】:

您可以使用唯一值构建一个新的数据框:

pd.DataFrame({key:pd.unique(value) for key, value in df.items()})
Out[252]: 
   Col1  Col2
0  1044  1924
1  1048  1926
2  1051  1927

【讨论】:

  • 再次感谢您。在真实数据集中有几列。我如何为操作设置这两列?
  • 请注意,这在这种特定情况下有效,其中列按“类似产品”的顺序排列,如果顺序不一致,则不一定是这种情况;)
  • 您可以过滤特定列:pd.DataFrame({key:pd.unique(value) for key, value in df.filter([l'Col1', 'Col2']).items()})
  • 是的,正如@mozway 所说,如果顺序不一致,这将不起作用
  • 是的,这是正确的。它也不适用于 NaN。
【解决方案2】:

这是另一种方法,无论顺序如何,列的数量都是任意的,如果需要更复杂的选择,应该很容易自定义:

(df.assign(x=df.groupby('Col1').ngroup(),
           y=df.groupby('Col1').cumcount())
  .query('x==y') # this can be updated in case more complex selections are required
  .drop(['x','y'], axis=1)
)

输出:

   Col1  Col2
0  1044  1924
4  1048  1926
8  1051  1927

编辑:非“类产品”数据的方法

df.assign(x=df.groupby('Col1', dropna=False).ngroup(),
          y=df.groupby('Col1', dropna=False).cumcount())
  .query('x>=y')
  .drop_duplicates('Col1', keep='last')
  .drop(['x','y'], axis=1)
)

输出:

    Col1  Col2
0   1044  1924
5   1048  1926
10  1051  1927
12  1058      

注意。我在这里将xy 保存为中间列,以便能够查看它的工作原理并进行调试,但您也可以直接使用这些操作进行切片

(df[df.groupby('Col1', dropna=False).ngroup().ge(
    df.groupby('Col1', dropna=False).cumcount())]
  .drop_duplicates('Col1', keep='last')
)

【讨论】:

  • 谢谢。我不得不修改df。当输出 df 中还有一行缺失值时,这将是完美的。如果没有,我可以将所有带有 NaN 的行保存到单独的 df 中,然后将它们附加到结果中。
  • @Parsyk 这就是我在原始答案中提到的。您需要更改过滤条件,请参阅更新。
【解决方案3】:

我认为,计算每一列并检查输出之间的相似性,代码如下;

df =df.assign(Date_cumcount=df.groupby('Date').cumcount(),Value_cumcount = df.groupby('Value').cumcount())
out =df[df['Date_cumcount']==df['Value_cumcount']].drop(['Date_cumcount','Value_cumcount'],1)



     Date Value
0   1044  1924
5   1048  1926
10  1051  1927
12  1058  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多