pandas从单个列中删除重复项,同时保持剩余的行不变

时间:2018-02-21 23:23:38

标签: python pandas duplicates

我有一个如下的数据框。我想从一列中删除重复项,同时保持行的其余部分不变。

我想要的逻辑是 -

对于列Jan,从最后一行开始

对于最后一个单元格,如果第二行的第二行中的值与当前值相同,则只删除单元格值(不要删除行)。

并继续直到你到达第一行

sales = [{'account': '3', 'Jan': 'try', 'Feb': '200 .jones', 'URL': 'ea2018-001.pdf try bbbbb why try'},
             {'account': '1',  'Jan': 'try', 'Feb': '210', 'URL': 'try '},
             {'account': '2',  'Jan': 'bbbbb',  'Feb': '90',  'URL': 'ea2017-104.pdf bb cc for why' }]
df = pd.DataFrame(sales)
df

df
Out[105]: 
          Feb    Jan                               URL account
0  200 .jones    try  ea2018-001.pdf try bbbbb why try       3
1         210    try                              try        1
2          90  bbbbb      ea2017-104.pdf bb cc for why       2

我想要的输出如下

          Feb    Jan                               URL account
0  200 .jones    try  ea2018-001.pdf try bbbbb why try       3
1         210                                      try        1
2          90  bbbbb      ea2017-104.pdf bb cc for why       2

2 个答案:

答案 0 :(得分:2)

首先,确定连续值重复的内容,然后使用pd.Series.mask隐藏它们。感谢piR的改进:

df.Jan.mask(df.Jan.eq(df.Jan.shift()), '')

    0      try
    1         
    2    bbbbb
    Name: Jan, dtype: object

您可以将其分配回df.Jan

答案 1 :(得分:1)

要将其替换为np.nan,您可以使用以下

df.loc[df.Jan == df.Jan.shift(), "Jan"] = np.nan

其中:

  • df.Jan.shift()Jan单元格中的值向上移动一次:

0    NaN
1    try
2    try
Name: Jan, dtype: object
  • df.Jan == df.Jan.shift()True列中与上一行具有相同值的每一行返回Jan

  • df.loc[df.Jan == df.Jan.shift(), "Jan"]第一个索引选择要修改的行,第二列Jan

如果您要删除第一行而不是第二行,则在pandas.DataFrame.shift()方法中,您应将periods值指定为-1。