从Pandas行中删除重复项,用NaN替换它们,将NaN移至行的末尾。

14 浏览
0 Comments

从Pandas行中删除重复项,用NaN替换它们,将NaN移至行的末尾。

问题:

如何从每行中删除重复的单元格,考虑每行分别(并可能用NaN替换)在Pandas数据框中?

如果我们能够将所有新创建的NaN值移动到每行的末尾,那就更好了。

相关但不同的帖子:

关于如何删除被认为是重复的整行的帖子:

- 如何删除Pandas数据框中具有重复列值的行?

- 在Python Pandas中删除跨多列的所有重复行

- 从Pandas数据框中删除仅某些列具有相同值的重复行

关于如何从Pandas列中删除重复项的帖子:

- 在数据框中删除行和列(单元格)中的重复项,使用Python

这里给出的答案返回一个字符串系列,而不是数据框。

可重现的设置:

import pandas as pd
# 创建数据框
df = pd.DataFrame({'a': ['A', 'A', 'C', 'B'],
                   'b': ['B', 'D', 'B', 'B'],
                   'c': ['C', 'C', 'C', 'A'],
                   'd': ['D', 'D', 'B', 'A']},
                   index=[0, 1, 2, 3])

创建的数据框df:

+----+-----+-----+-----+-----+

| | a | b | c | d |

|----+-----+-----+-----+-----|

| 0 | A | B | C | D |

| 1 | A | D | C | D |

| 2 | C | B | C | B |

| 3 | B | B | A | A |

+----+-----+-----+-----+-----+

一种从每行中删除重复项的方法是分别考虑每行:

df = df.apply(lambda row: pd.Series(row).drop_duplicates(keep='first'), axis='columns')

使用apply()、lambda函数、pd.Series()和Series.drop_duplicates()。

将所有NaN值移动到每行的末尾,使用Shift NaNs to the end of their respective rows:

df.apply(lambda x: pd.Series(x[x.notnull()].values.tolist() + x[x.isnull()].values.tolist()), axis='columns')

输出:

+----+-----+-----+-----+-----+
|    | 0   | 1   | 2   | 3   |
|----+-----+-----+-----+-----|
|  0 | A   | B   | C   | D   |
|  1 | A   | D   | C   | nan |
|  2 | C   | B   | nan | nan |
|  3 | B   | A   | nan | nan |
+----+-----+-----+-----+-----+

正如我们所希望的。

问题:

有没有更有效的方法来做到这一点?也许使用一些内置的Pandas函数?

0