从Pandas行中删除重复项,用NaN替换它们,将NaN移至行的末尾。
从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函数?