Python 对数据帧行执行函数以减少重复对

Python 对数据帧行执行函数以减少重复对,python,python-3.x,pandas,dataframe,lambda,Python,Python 3.x,Pandas,Dataframe,Lambda,我有一个数据框,看起来像: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 13 13.4 13.4 12.4 12.4 16 0 0 0 0 14 12.2 12.2 13.4 13.4 12.6 12.6 19 5 5 6.7

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

0     1      2      3       4       5       6       7      8     9     10     11
12    13     13     13.4    13.4    12.4    12.4    16     0     0     0      0
14    12.2   12.2   13.4    13.4    12.6    12.6    19     5     5     6.7    6.7
.
.
.
每个“层”或行都有我想要减少的重复对

一个问题是也有重复的0,所以我不能简单地删除每行的重复项,否则会留下不均匀的行数

我想要的输出将是一个lambda函数,我可以应用于此数据帧的所有行,以获得以下结果:

0     1      2      3       4       5      6 
12    13     13.4   12.4    16      0      0
14    12.2   13.4   12.6    19      5      6.7
.
.
.
有没有一个简单的函数我可以编写来实现这一点

from itertools import zip_longest
l=[sorted(set(x), key=x.index) for x in df.values.tolist()]
newdf=pd.DataFrame(l).ffill(1)
newdf
Out[177]: 
      0     1     2     3     4    5    6
0  12.0  13.0  13.4  12.4  16.0  0.0  0.0
1  14.0  12.2  13.4  12.6  19.0  5.0  6.7
方法1使用 正如Yuca在评论中提到的:

df = df.T.drop_duplicates().T
df.columns = range(len(df.columns))

print(df)
      0     1     2     3     4    5    6
0  12.0  13.0  13.4  12.4  16.0  0.0  0.0
1  14.0  12.2  13.4  12.6  19.0  5.0  6.7
方法2使用带有偶数的
列表理解
我们可以列出偶数,然后根据其索引选择这些列:

idxcols = [x-1 for x in range(len(df.columns)) if x % 2]

df = df.iloc[:, idxcols]

df.columns = range(len(df.columns))


如果下一列不等于添加的最后一列,则可以使用
functools.reduce
将列顺序连接到输出数据帧:

from functools import reduce
output_df = reduce(
    lambda d, c: d if (d.iloc[:,-1] == df[c]).all() else pd.concat([d, df[c]], axis=1),
    df.columns[1:],
    df[df.columns[0]].to_frame()
)
print(output_frame)
#    0     1     3     5   7  8   10
#0  12  13.0  13.4  12.4  16  0  0.0
#1  14  12.2  13.4  12.6  19  5  6.7
如果重要的话,此方法还维护所选列的列名

假设这是您的输入
df

print(df)
#    0     1     2     3     4     5     6   7  8  9   10   11
#0  12  13.0  13.0  13.4  13.4  12.4  12.4  16  0  0  0.0  0.0
#1  14  12.2  12.2  13.4  13.4  12.6  12.6  19  5  5  6.7  6.7

转置+重复?重复总是连续列吗?每行重复成对出现,但行与行之间可能不同,因此具有唯一值的行不总是在同一位置。标题重要吗?意思是,列应该有那些精确的值吗?@HelloToEarth,第一个方法将删除重复的值,而不管位置如何(不清楚这是否是一个要求,只需指出它)。例如,如果有一列
12
的值与列
1
的值相同,则列
12
将被删除,即使它与列
1
不连续。是的,我刚刚发现了这一点。抱歉,我需要澄清的是,我只希望删除并排重复的对(而不是行中的所有重复项)。这包括在末尾找到的0。这些方法不保留零。@HelloToEarth应该可以工作。
print(df)
#    0     1     2     3     4     5     6   7  8  9   10   11
#0  12  13.0  13.0  13.4  13.4  12.4  12.4  16  0  0  0.0  0.0
#1  14  12.2  12.2  13.4  13.4  12.6  12.6  19  5  5  6.7  6.7