【问题标题】:Reducing duplicate values in dataframe by pairs in Python在Python中成对减少数据框中的重复值
【发布时间】:2019-09-28 15:21:06
【问题描述】:

我有一个如下所示的数据框:

df_pairs

128.437     128.437     121.639  5100.9     5029.08   5029.08   4888.81  4888.81    0         0         0    0   0   0
129.588     129.588     122.79   5102.05    5030.24   5030.24   4959.55  4959.55    4889.96   4889.96   0    0   0   0

我想保留每行中的所有唯一值,并将每个重复值减少到仅配对值中的 1 个。

输出将是:

df_unique

128.437     121.639  5100.9   5029.08    4888.81    0          0   0
129.588     122.79   5102.05  5030.24    4959.55    4889.96    0   0

所以你现在可以看到每一行都有一对/2,如果该对相等。

伪代码类似于:

df_unique = pd.DataFrame(columns=df_pairs.columns)

for columns in range(len(df_pairs.columns)):

     if df_pairs.iloc[row_element] == df_pairs.iloc[row_element+1]:

             unique_element = df_pairs.iloc[row_element]
             df_unique[new_row_element] = unique_element

有没有什么方法可以快速做到这一点,而无需逐行逐行迭代?

我不能简单地使用df.drop_duplicates() 删除所有重复项,因为行中可能存在重复值不一定是邻居对,而且如果存在我想保持唯一对的 0,则它们发生了。

【问题讨论】:

  • 顺序必须保持不变,但索引明显偏移。
  • 只有相邻的事物才被认为是对,还是 0 10 0 仍然会将 0 视为重复项?
  • 不只是相邻对。

标签: python python-3.x pandas dataframe duplicates


【解决方案1】:

试试这个:

(df.groupby(df.ne(df.shift(axis=1)).all(axis=0).cumsum(), 
            axis=1)
 .apply(lambda x: x.drop(x.columns[1::2], axis=1))
 .dropna(axis=1)
)

输出:

          0        2        3        4        6        8    10    12
--  -------  -------  -------  -------  -------  -------  ----  ----
 0  128.437  121.639  5100.9   5029.08  4888.81     0        0     0
 1  129.588  122.79   5102.05  5030.24  4959.55  4889.96     0     0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2022-01-25
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2019-05-30
    相关资源
    最近更新 更多