python - 用于删除跨列具有相同内容的连续重复行的数据框

标签 python pandas dataframe duplicates

下面的数据框,当“人员”、“年份”和“项目”相同时,我想删除连续的重复行。

如果原始数据框如下所示,则连续具有相同“人物”、“年份”、“项目”的行将被删除。

data = {'People' : ["David","David","David","David","John","John","John"],
'Year': ["2016","2016","2017","2016","2016","2017","2017",],
'Project' : ["TN","TN","TN","TN","DJ","DM","DM"],
'Earning' : [878,682,767,620,964,610,772]}

我尝试了这个,但它不起作用:

df_1 = df.loc[(df['People', 'Year', 'Project'].shift() != df['People', 'Year', 'Project'])]

尝试 - 此行删除不连续的“David, 2016, TN, 620”

df_1 = df.drop_duplicates(subset=['People','Year','Project'])

enter image description here

更改为此后,它会保留所有行:

df_1 = df.drop_duplicates(subset=['People','Year','Project', 'Earning'])

正确的做法是什么?谢谢!

最佳答案

您可以比较DataFrame.shift ed 值不等于,然后通过 DataFrame.any 每行测试至少一个 Trueboolean indexing :

cols = ['People','Year','Project']
df_1 = df[df[cols].ne(df[cols].shift()).any(axis=1)]
print (df_1)
  People  Year Project  Earning
0  David  2016      TN      878
2  David  2017      TN      767
3  David  2016      TN      620
4   John  2016      DJ      964
5   John  2017      DM      610

详细信息:

print (df[cols].ne(df[cols].shift()))
   People   Year  Project
0    True   True     True
1   False  False    False
2   False   True    False
3   False   True    False
4    True  False     True
5   False   True     True
6   False  False    False

print (df[cols].ne(df[cols].shift()).any(axis=1))
0     True
1    False
2     True
3     True
4     True
5     True
6    False
dtype: bool

关于python - 用于删除跨列具有相同内容的连续重复行的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60111199/

相关文章:

python - 为什么这种切片代码比更多的过程代码更快?

python - 转移学习为何要删除最后一个隐藏层?

iterator - 使用 `@transform` 在 Julia 中转换 DataFrame

python - 搜索和更新 Pandas 数据框中每一行值的最快方法

python - 从 Pandas 数据框列中删除 'seconds' 和 'minutes'

python - 如何在 Windows 上使用信号退出功能?

python - IOError - 解码器 jpeg 不可用 - 即使在安装 libjpeg-dev n PIL 之后也是如此

python - Pandas MultiIndex 与 Panel

python:如何融化保留特定顺序/自定义排序的数据框

python - 根据当前列中的值在 Pandas 中的 np.where 上创建条件