Python Pandas Dataframe:使用count函数过滤数据
我有一个pandas dataframe,我想从中创建一个新的dataframe,方法是基于count函数应用一个过滤器,以便只选择那些计数等于指定数字的列 例如,在下面的数据框中:Python Pandas Dataframe:使用count函数过滤数据,python,pandas,dataframe,count,Python,Pandas,Dataframe,Count,我有一个pandas dataframe,我想从中创建一个新的dataframe,方法是基于count函数应用一个过滤器,以便只选择那些计数等于指定数字的列 例如,在下面的数据框中: month_end Col A Col B Col C Col D 200703 NaN NaN NaN NaN 200704 0.084 0.152 0.142 0.07
month_end Col A Col B Col C Col D
200703 NaN NaN NaN NaN
200704 0.084 0.152 0.142 0.0766
200705 0.124 0.123 0.020 NaN
200706 NaN 0.191 0.091 0.149
200707 -0.136 0.047 0.135 -0.127
如果my_变量=4,则df1应仅包含列B和列D以及索引月底
我该如何做到这一点?您可以按照以下思路做一些事情:
df.loc[:,df.notna().sum(0).eq(4)]
ColB ColC
0 NaN NaN
1 0.152 0.142
2 0.123 0.020
3 0.191 0.091
4 0.047 0.135
或者还有count
,它已经在计数之前删除了重复:
df.loc[:,df.count().eq(4)]
如果要包含日期列,但该列不是索引,请执行以下操作:
ix = df.notna().sum(0).eq(4)
df.loc[:,ix.index[ix].union(['month_end'])]
ColB ColC month_end
0 NaN NaN 200703
1 0.152 0.142 200704
2 0.123 0.020 200705
3 0.191 0.091 200706
4 0.047 0.135 200707
具有for循环的解决方案:
for col in df.columns:
if (df[col].count() != 4):
df.drop(col, axis=1)
另一个没有循环的解决方案:
s = df.notna().sum(0) == 4
df = df.loc[:, s]
所以我的第一个问题是:你先试过什么吗?Dataframes有一个
count
方法,该方法将为您提供一个系列,其中索引是列的名称,值是该列中非空结果的数量。您可以添加一个运行示例吗?这将告诉我们您在哪里,并为我们省去自己构建数据框架的麻烦。顺便说一句,澄清“计数”-我想你想要非NaN
值的计数,但要具体。是的。我对应用基于列的过滤器有一些了解,但我不太确定如何在所有列上应用计数函数来创建新的数据帧。感谢you@tdelaney,是,我想基于非NaN值进行过滤。我在问题中添加了一个图像。我希望这能让我的问题更容易理解。非常感谢您的回复。@Jamil--这是dataframe.count()
他也可以返回日期column@Chris这个答案是正确的。如果month\u end
“column”实际上是索引,那么当OP在实际数据帧上运行此操作时,它将被包括在内。感谢各位@Chris paulinstead.notna().sum()
,我将使用.count()
感谢大家的快速帮助。看起来这个解决方案非常有效。查看数据帧(df1),我可以看到行数较少的列已从数据帧中截断。将对我的数据进行更详细的核对,但这看起来或多或少已排序。再次感谢。这里不需要写循环。这不是必须的,而是一个选项。能否成为一个好的团队取决于@Jamil下一步计划做什么,但事实并非如此。由于您没有保存drop
的输出,因此这根本不会作用于OP的数据帧。Loop很少是pandas选项的好选择。谢谢大家的回复,但我希望有人能帮助我找到更有效的解决方案。谢谢你,嗯。刚才看到它和上面的@yatu类似:-(非常感谢你的帮助。我今天学到了一些非常优雅的解决方案。再次感谢你。当然。我是新来的(不是很活跃)。我以后会记住这一点。非常感谢。作为@gtomer的未来参考,用户在意识到发布了相同的答案时,往往会删除该答案。这避免了关于答案是否被复制的混淆(我肯定不是这样的)另一个明显的原因是,有两个相同的答案没有多大用处。@yatu-试图删除它,但无法删除,因为它被“接受”。对不起。