【问题标题】:Manipulating python function outputs with for loop使用 for 循环操作 python 函数输出
【发布时间】:2017-03-01 14:32:57
【问题描述】:

从 stats.scipy 中,我已将变异系数测试应用于数据框中的每个数字列,并且我想筛选输出,以便它仅显示值大于 0 且未丢失的列。这是我的代码:

x = df.select_dtypes(exclude=['object']).apply(stats.variation)*100

for i in x:
    if i != 'NaN' and i != 0:
        print i

它仍然返回 NaN 和 0 值。我该如何解决这个问题?另外,如何格式化它,以便循环返回变量的名称以及数值?

编辑: 这是我存储在 x 中的函数的输出:

 var_1               NaN
 var_2               3.809518
 var_5               7.031835
 var_10              20.190090
 var_20              21.217053
 var_30              20.806000

我想格式化输出以便不显示 var_1

【问题讨论】:

    标签: python pandas for-loop scipy


    【解决方案1】:

    我认为您需要notnull 来检查NaN,然后检查0 并返回所有True 通过all。最后使用locboolean indexing

    mask = (df.notnull() & (df != 0)).all()
    
    print (df.loc[:, mask])
    

    示例:

    x = pd.DataFrame({'A':[1,0,0],
                       'B':[4,np.nan,6],
                       'C':[7,8,9]})
    
    print (x)
       A    B  C
    0  1  4.0  7
    1  0  NaN  8
    2  0  6.0  9
    
    print (x.notnull() & (x != 0))
           A      B     C
    0   True   True  True
    1  False  False  True
    2  False   True  True
    
    print ((x.notnull() & (x != 0)).all())
    A    False
    B    False
    C     True
    dtype: bool
    
    mask = (x.notnull() & (x != 0)).all()
    print (x.loc[:, mask])
       C
    0  7
    1  8
    2  9
    

    编辑:

    如果xSeries,则使用:

    x = pd.Series([np.nan, 1, 0, 0, 5, np.nan])
    print (x)
    0    NaN
    1    1.0
    2    0.0
    3    0.0
    4    5.0
    5    NaN
    dtype: float64
    
    print (x[x.notnull() & (x != 0)])
    1    1.0
    4    5.0
    dtype: float64
    

    编辑1:

    x = pd.Series([np.nan, 3.809518, 7.031835000000001, 20.190089999999998, 21.217053, 20.806], 
                  index=['var_1', 'var_2', 'var_5', 'var_10', 'var_20', 'var_30'])
    print (x)
    var_1           NaN
    var_2      3.809518
    var_5      7.031835
    var_10    20.190090
    var_20    21.217053
    var_30    20.806000
    dtype: float64
    
    print (x.notnull() & (x != 0))
    var_1     False
    var_2      True
    var_5      True
    var_10     True
    var_20     True
    var_30     True
    dtype: bool
    
    print (x[x.notnull() & (x != 0)])
    var_2      3.809518
    var_5      7.031835
    var_10    20.190090
    var_20    21.217053
    var_30    20.806000
    Name: 1, dtype: float64
    

    【讨论】:

    • 在函数输出上尝试了你的代码,我收到一条错误消息:索引器太多
    • x.info() 是什么?
    • x.info() 返回错误。 type(x) 是 pandas.core.series.Series
    • 我运行了该代码,然后运行了您答案中的掩码代码,它只返回一个空数据帧
    • 对不起朋友,尝试了编辑代码,它也不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多