我连接了两个相似的数据框,它们具有很多重复的值,因为它们基本上是相同的数据集,但使用的年份不同。
问题在于,其中一组缺少某些值,而另一组有时具有这些值。
例如:
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
.
.
如何保留这些值而不是空白?
答案 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