在Python中按对减少数据框中的重复值

Hel*_*rth 4 python duplicates dataframe python-3.x pandas

我有一个数据框,看起来像:

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
Run Code Online (Sandbox Code Playgroud)

我想在每一行中保留所有唯一值,并将每个重复值减少到成对值中只有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
Run Code Online (Sandbox Code Playgroud)

因此,如您现在所见,每行有一个对/ 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
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以快速执行此操作,而无需逐对逐行进行迭代?

我不能简单地删除所有重复项,df.drop_duplicates()因为事实是,行中可能存在重复的值,这些重复值不一定是邻居对,而且如果要在唯一对中保留0,那么我会保留它们。

Qua*_*ang 5

尝试这个:

(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)
)
Run Code Online (Sandbox Code Playgroud)

输出:

          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
Run Code Online (Sandbox Code Playgroud)