gpt4 book ai didi

Python:按条件删除重复项

转载 作者:行者123 更新时间:2023-12-01 21:27:59 34 4
gpt4 key购买 nike

我有一些职位的数据,有任期开始月份和任期结束月份。

Name   Year   Month   Start
A 1994 05 1
A 1996 04 0
B 1996 04 1
B 1996 12 0
C 1996 12 1
C 1999 02 0

专栏Start等于 1表示此人从本月开始,0表示他/她将在本月离职。

我需要将月度数据转换为年度数据,即分配给定年份中担任该职位的人员。我的想法是找到在那个职位上呆半年以上的人。即我要实现:

Year    Name
1994 A
1995 A
1996 B
1997 C
1998 C

我想我需要删除基于 df['Year'] 的重复项.

我能做到df_annual = df.drop_duplicates(subset=['Year'])考虑到任期长度,我认为如果 df['Month']<'06' 可以删除重复项。和 Start == 0 ,或者如果 df['Month']>'06'Start == 1 .即下半年离校或上半年开学。

一般来说,问题归结为如果它们具有相同的 'Year' 如何选择一行.

有谁知道如何在 python 中执行此操作?

最佳答案

这个非常难。我选择重新索引以获取缺失的年份,例如 1997 和 1998。然后,我使用 ffill() 填充 Start 列,为大量的 np.where 用于删除不需要的行的逻辑。

输入:

df = pd.DataFrame({'Name': {0: 'A', 1: 'A', 2: 'B', 3: 'B', 4: 'C', 5: 'C'},
'Year': {0: 1994, 1: 1996, 2: 1996, 3: 1996, 4: 1996, 5: 1999},
'Month': {0: 5, 1: 4, 2: 4, 3: 12, 4: 12, 5: 2},
'Start': {0: 1, 1: 0, 2: 1, 3: 0, 4: 1, 5: 0}})

代码:

#reindexing to get missing years
df['dt'] = pd.to_datetime(df['Year'], format='%Y')
df = (df.set_index('dt').groupby('Name')
.apply(lambda d: d.reindex(pd.date_range(min(df.dt),
max(df.dt),
freq='YS')))
.drop('Name', axis=1)
.reset_index('Name').reset_index())
#specified logic to keep relevant rows and columns
df['Start'] = df['Start'].ffill()
m1 = np.where(~((df['Start'] == df['Start'].shift())
& (df['Start'] == 0)
& (df['Start'].shift() == 0))
| (df['Year'].notnull()),
'keep', 'drop')
df = df[m1 == 'keep']
m2 = np.where(((df['Month']< int('06')) & (df['Start'] == 0))
| ((df['Month']>int('06')) & (df['Start'] == 1)),
'drop', 'keep')
df = df[m2 == 'keep']
df['Year'] = df['index'].dt.year
df = df.drop(['index', 'Month', 'Start'], axis=1).reset_index(drop=True)
df

输出:

    Name Year
0 A 1994
1 A 1995
2 B 1996
3 C 1997
4 C 1998

关于Python:按条件删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62843435/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com