我有一个看起来像这样的数据框:
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
.
.
.
我可以编写一个简单的函数来做到这一点吗?
答案 0 :(得分:3)
transpose
如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