Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas Dataframe:使用count函数过滤数据_Python_Pandas_Dataframe_Count - Fatal编程技术网

Python Pandas 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

我有一个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.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-试图删除它,但无法删除,因为它被“接受”。对不起。