我正在使用pandas数据帧,我想在满足条件(cond = 1)后删除具有相同名称的观察。
我的数据集如下:
data
Year amount
2017 100
2017 200
2016 300
2016 100
2015 200
2015 200
2014 100
2013 100
expected result
year amount
2017 183.33
2016 166.66
2015 133.33
2014 100
2013 100
我想得到这个:
person cond
A 0
A 0
A 1
A 0
A 0
B 0
B 1
C 1
C 0
我希望代码首先检查下一个人是否具有相同的名称,然后检查是否满足条件(cond = 1),如果是,则删除所有具有相同名称的下一行。
有人可以帮我吗?
答案 0 :(得分:1)
您可以使用groupby
和apply
lambda
来执行此操作,该idxmax
使用1
从开始切割df直到第一个最大值,在这种情况下将是第一个In [16]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index()
Out[16]:
person level_1 cond
0 A 0 0
1 A 1 0
2 A 2 1
3 B 5 0
4 B 6 1
5 C 7 1
值:
drop
您还可以拨打'level_1'
来删除In [23]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index().drop('level_1', axis=1)
Out[23]:
person cond
0 A 0
1 A 0
2 A 1
3 B 0
4 B 1
5 C 1
col:
1
<强>更新强>
要处理组中没有lambda
的情况,我们可以测试In [24]:
import pandas as pd
import io
# setup some data
t="""person cond
A 0
A 0
A 1
A 0
A 0
B 0
B 1
C 1
C 0
D 0
D 0"""
df = pd.read_csv(io.StringIO(t), delim_whitespace=True)
df
Out[24]:
person cond
0 A 0
1 A 0
2 A 1
3 A 0
4 A 0
5 B 0
6 B 1
7 C 1
8 C 0
9 D 0
10 D 0
In [29]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()] if len(x[x==0]) != len(x) else x)
Out[29]:
person
A 0 0
1 0
2 1
B 5 0
6 1
C 7 1
D 9 0
10 0
Name: cond, dtype: int64
中的情况:
0
所以在这里我们测试所有值是否为SELECT t1.line_seg, t1.mgt_year, t1.[tot_dflt_mgt]
, FIRST_VALUE(t1.tot_accum_mgt) OVER(PARTITION BY t1.[line_seg] ORDER BY t1.mgt_year DESC)
- ISNULL(SUM(t2.[tot_dflt_mgt]) OVER(PARTITION BY t2.[line_seg] ORDER BY t2.mgt_year DESC), 0) AS tot_accum_mgt
FROM [dbo].[t] AS t1
LEFT JOIN [dbo].[t] AS t2 ON (t2.line_seg = t1.line_seg AND t2.mgt_year = t1.mgt_year + 1)
ORDER BY t1.line_seg, t1.mgt_year ASC;
,如果是,则返回组,否则我们像以前一样切片