我有一个df,每个公司有4个观测值(第4季度)。但是,对于一些公司,我只有不到4个观察结果。当我没有公司的四个季度时,我想删除所有与公司有关的观察结果。任何想法如何做到这一点?
这是df的样子:
Quarter Year Company
1 2018 A
2 2018 A
3 2018 A
4 2018 A
1 2018 B
2 2018 B
1 2018 C
2 2018 C
3 2018 C
4 2018 C
在此df中,我想删除相对于公司B的行,因为我只有2个季度。
非常感谢!
答案 0 :(得分:4)
将transform
与size
一起用于与原始DataFrame
相同大小的系列,因此可以进行过滤:
df = df[df.groupby('Company')['Quarter'].transform('size') == 4]
#if want check by Companies and years
#df = df[df.groupby(['Company','Year'])['Quarter'].transform('size') == 4]
print (df)
Quarter Year Company
0 1 2018 A
1 2 2018 A
2 3 2018 A
3 4 2018 A
6 1 2018 C
7 2 2018 C
8 3 2018 C
9 4 2018 C
如果性能不重要或较小的DataFrame,请使用DataFrameGroupBy.filter
:
df = df.groupby('Company').filter(lambda x: len(x) == 4)
答案 1 :(得分:2)
使用value_counts
s=df.Company.value_counts()
df.loc[df.Company.isin(s[s==4].index)]
Out[527]:
Quarter Year Company
0 1 2018 A
1 2 2018 A
2 3 2018 A
3 4 2018 A
6 1 2018 C
7 2 2018 C
8 3 2018 C
9 4 2018 C
答案 2 :(得分:0)
您可以浏览“公司”列,检查是否拥有全部四个季度的结果。
for i in set(df['Company']):
if len(df[df['Company']==i)!=4:
df=df[df['Company']!=i]