删除重复的行但保留某些值Pandas

时间:2019-01-16 14:21:07

标签: python python-3.x pandas dataframe merge

我连接了两个相似的数据框,它们具有很多重复的值,因为它们基本上是相同的数据集,但使用的年份不同。

问题在于,其中一组缺少某些值,而另一组有时具有这些值。

例如:

Name        Unit       Year      Level
Nik         1          2000      12
Nik         1                    12
John        2          2001      11
John        2          2001      11
Stacy       1                    8
Stacy       1          1999      8
.
.

我想在subset = ['Name', 'Unit', 'Level']上放置重复项,因为某些重复项没有年份。

但是,我留下的数据中没有Year,我想保留这些值:

Name        Unit       Year      Level
Nik         1          2000      12
John        2          2001      11
Stacy       1          1999      8
.
.

如何保留这些值而不是空白?

3 个答案:

答案 0 :(得分:1)

sort_values与默认参数variables: GIT_SSL_NO_VERIFY: "true" image: someimage:latest #replace with any valid image which has ssh installed before_script: - mkdir -p ~/.ssh - echo -e "$STAGING_SSH_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' stages: - deploy deploy_STAGING_job: stage: deploy script: - echo "ssh into the below random IP" - ssh myuser@10.200.200.200" echo "Login using ssh to remote instance" " 一起使用,因此应省略,然后再drop_duplicates

na_position='last'

或者:

print (df)
    Name  Unit    Year  Level
0    Nik     1     NaN     12
1    Nik     1  2000.0     12
2   John     2  2001.0     11
3   John     2  2001.0     11
4  Stacy     1     NaN      8
5  Stacy     1  1999.0      8

subset = ['Name', 'Unit', 'Level']
df = df.sort_values('Year').drop_duplicates(subset)

df = df.sort_values(subset + ['Year']).drop_duplicates(subset)

另一种解决方案,其中GroupBy.first用于按组返回第一个print (df) Name Unit Year Level 5 Stacy 1 1999.0 8 1 Nik 1 2000.0 12 2 John 2 2001.0 11 的第一个非缺失值:

Year

答案 1 :(得分:0)

想到的一个解决方案是,首先使用sortvalues函数按年份对连接的数据框进行排序: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html 然后使用keep ='first'参数删除重复项

df.drop_duplicates(subset=['Name', 'Unit', 'Level'], keep="first")

答案 2 :(得分:0)

我建议您看一下合并数据集的创建步骤。

合并数据集时,您可以对多个索引进行操作,即

df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'],  suffixes=['', '_r'])

使用外部联接,您可以收集所有数据集并立即删除重复项。剩下的唯一事情就是合并Year列,您可以这样做:

df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)

这填补了空白,之后您只需删除“ Year_r”列即可。

这样做的好处是,不仅可以覆盖缺失年份的NaN值,还可以覆盖以空字符串表示的缺失Years。

下面是一个小例子:

import pandas as pd
import numpy as np


left = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo', 'Peter', 'Adam'],
                     'Unit': ['2', '4', '6', '2', '4', '12'],
                     'Year': ['', '2009', '1954', '2025', '2012', '2024'],
                     'Level': ['L1', 'L1', 'L0', 'L4', 'L3', 'L10']})

right = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo'],
                     'Unit': ['2', '4', '6', '2'],
                     'Year': ['2010', '2009', '1954', '2025'],
                     'Level': ['L1', 'L1', 'L0', 'L4']})

df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'],  suffixes=['', '_r'])
df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)
df