在数据框行上起作用以减少重复对Python

时间:2019-05-08 15:38:25

标签: 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    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
.
.
.

我可以编写一个简单的函数来做到这一点吗?

3 个答案:

答案 0 :(得分:3)

使用transpose

的方法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

使用list comprehension和偶数的方法2

我们可以列出偶数的列表,然后根据其索引选择这些列:

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

df = df.iloc[:, idxcols]

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

print(df)
    0     1     2     3  4    5
0  12  13.0  13.4  12.4  0  0.0
1  14  12.2  13.4  12.6  5  6.7

答案 1 :(得分:1)

以您的情况

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

答案 2 :(得分:0)

如果下一列与添加的最后一列不相等,则可以使用Random将列依次连接到输出DataFrame:

Random

如果重要的话,此方法还维护选择的列的列名。

假设这是您的输入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