【问题标题】:Dropping columns on a dataframe based on their count of values根据值的计数在数据框中删除列
【发布时间】:2021-02-14 06:47:42
【问题描述】:

您好,我是 pandas 的新手,正在为操作而苦苦挣扎。 我有一个包含大量列的数据框 df,我只想保留计数超过 5000 个值的列数。

我尝试了下面的循环,但它不起作用。有什么简单的方法可以做到这一点?还有我可以创建一个函数来将其应用于我想保留只有 n 个值或更多值的列的任何数据框吗?

for column in df.columns: 
   if df[column].count() > 5000: 
      column = column
   else: 
      df[column].drop()

谢谢

【问题讨论】:

  • “计数”到底是什么意思?你的意思是非 NaN 值?那么非缺失值呢?
  • 是的,非 NaN 值。因此,例如,当您执行 df.describe() 时,我想过滤掉所有计数少于 5000 的列。

标签: python pandas dataframe data-cleaning


【解决方案1】:

试试这个:

newdf=df.copy()
for column in newdf.columns: 
    if df[column].count() <= 5000: 
        df=df.drop(column, axis=1) 

或等价物:

newdf=df.copy()
for column in newdf.columns: 
    if df[column].count() <= 5000: 
        del df.column

【讨论】:

  • 感谢您的帮助,但它无法完全发挥作用。第二个没有运行,第一个运行但是当我尝试在下一个单元格中查看 df 时,它会使笔记本崩溃两次。有没有更有效的方法来做到这一点?
  • 可能是因为我们同时在循环和删除项目。我在 df 的副本上添加了一个带有循环的版本,你能再试一次吗?
  • 还是很慢。第一个解决方案肯定有效,但速度很慢!
【解决方案2】:

我们可以使用DataFrame.dropna,其参数为thresh,例如:

import pandas as pd
import numpy as np

# example dataframe
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, np.nan],
    'C': [np.nan, np.nan, 6],
    'D': [np.nan, np.nan, np.nan]
})


   A    B    C   D
0  1  4.0  NaN NaN
1  2  5.0  NaN NaN
2  3  NaN  6.0 NaN

我们将阈值设置为2,在您的情况下为5000

df.dropna(thresh=2, axis=1)

   A    B
0  1  4.0
1  2  5.0
2  3  NaN

注意列 CD 已删除,因为它们的非 Na 值少于 2 个

【讨论】:

  • 谢谢!尽管根据文档 tresh = 来自非 Na 值的要求,这非常有效。所以 C 和 D 下降了,因为它们的非 Na 值少于 2 个
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多