我有一个如下的数据框。我想从一列中删除重复项,同时保持行的其余部分不变。
我想要的逻辑是 -
对于列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
答案 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。