【问题标题】:Function on dataframe rows to reduce duplicate pairs Python数据框行上的函数以减少重复对 Python
【发布时间】:2019-05-08 15:38:24
【问题描述】:

我有一个看起来像这样的数据框:

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
.
.
.

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

【问题讨论】:

  • 转置+复制?
  • 重复的列总是连续的吗?
  • 每行重复出现成对,但行之间可能不同,因此具有唯一值的行并不总是在同一个位置。
  • 标题重要吗?意思是,列应该有那些确切的值吗?

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


【解决方案1】:

方法一使用transpose

正如 Yuca 在 cmets 中提到的:

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

【讨论】:

  • @HelloToEarth,第一种方法将删除重复的值,无论位置如何(不清楚这是否是要求,只是指出来)。例如,如果您的列 12 与列 1 具有相同的值,则列 12 将被删除,即使它与列 1 不连续。
  • 是的,我刚刚发现了这一点。抱歉,我需要澄清一下,我只希望删除并排重复的 pairs(不是行中的所有重复项)。这包括最后找到的 0。这些方法不保留零。
  • @HelloToEarth my solution 应该可以工作。
【解决方案2】:

你的情况

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

【讨论】:

    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2023-01-31
      • 2020-04-03
      • 2018-12-01
      • 2022-01-25
      相关资源
      最近更新 更多