Python Pandas发现非零指数

时间:2013-05-26 02:35:08

标签: python numpy pandas

您好我正在尝试使用pandas来整理DataFrame。它是从电子表格导入的,并且有一些空的行和列。

我以为我可以用

df.apply(numpy.nonzero(),axis=1)df.apply(numpy.nonzero(),axis=0)获取非零列的索引,以便我可以从DataFrame中删除那些反转。这给了我一个元组列表我不清楚如何获取在

numpy.nonzero(df)会生成一个包含所有非零值的数组,但我不确定如何将该值提供给all()函数。

我的问题是从DataFrame中删除那些全部为空的索引行和列的最佳和最快捷方式(或者所有索引行和列都具有N / A等值)

由于

添加源电子表格的EDIT示例

<bound method DataFrame.head of             0         1         2  3         4         5  6         7         8  9   \
0                                                                                     
1   some title                                                                        
2         date     38477                                                              
3                                                                                     
4                                                                                     
5                   cat1                   cat2                   cat3                
6                      a         b            c         d            e         f      
7                                                                                     
8            Z  167.9404  151.1389      346.197  434.3589     336.7873  80.52901      
9            X   220.683   56.0029     73.73679  428.8939     483.7445  251.1877      
10           C  433.0189  390.1931     251.6636  418.6703     12.21859   113.093      
11                                                                                    
12           V  226.0135  418.1141     310.2038  153.9018     425.7491  73.08073      
13           W   295.146  173.2747     2.187459  401.6453     51.47293   175.387      
14           S  306.9325  157.2772     464.1394   216.248     478.3903   173.948      
15           A  19.86611  73.11554      320.078  199.7598     467.8272  234.0331      
16                                                                                    
17           F   225.511  20.97305     425.8834  190.1625     123.9103  116.3803      
18           R  130.4728  96.08118     428.2007  22.46184     26.34678  359.5625      
19           E  239.1516  439.7733     197.7023  121.6911     195.0169  264.5553      
20           W  227.1557  471.8341     165.3779  151.7552     314.7827  367.0868      

这是我现在使用的def,但感觉非常笨重

def nulls(x):
    ''' the NULS section to clear all nulls from the 
DataFrame'''
    # Empty Rows
    nr = [i for i in x.index if all(str(k) in '' for k in x.ix[i])]
    # Non Empty Rows
    r = [i for i in x.index if i not in nr]
    # Empty columns
    nc = [j for j in range(x.shape[1]) if all(str(k) in '' for k in x[j])]
    # Non Empty Columns
    c = [j for j in range(x.shape[1]) if j not in nc]
    # Subset the non-empties
    x=x.ix[r,c]
    x=x.reindex()
    return(x)

2 个答案:

答案 0 :(得分:4)

dropna(how='all')正是您正在寻找的(通常),但您需要加载数据框,以便将空单元格视为NaN而不是空字符串。也就是说,你有几个选择。

如果您确定要删除的所有内容都是文字空字符串(''Nonenp.NaN0和< / em>您不想保留0,然后您可以填充NaN并转换为布尔值并检查总和是否为0.您可以根据您想要的方式进行调整

indexer = df.fillna(False).astype(bool)
drop_columns = indexer.sum(0) == 0
keep_rows = indexer.sum(1) != 0

new_df = df.drop(df.columns[drop_columns], axis=1)[keep_rows]

但是,如果您需要检查空格,或者想要排除文字零,那么您应该使用带有函数的applymap(主要基于this StackOverflow answer on dropping None/empty/whitespace columns),然后执行相同的操作上方。

def is_blank(x):
    return x is None or pd.isnull(x) or bool(str(x).strip())

indexer = df.applymap(is_blank)

就个人而言,我建议您在加载数据集时将''添加到na_values


fillna()astype()

的简要说明

fillna()可让您用其他值“填充”NA值。在这里,我们填充False(因为bool(float('nan'))计算结果为True),但您可以填充任何值或使用各种不同的方法。 astype将数组从一种类型转换为另一种类型。所以放astype(bool)意味着它将整个数组转换为TrueFalse(分别相当于10)然后你就可以了总和以查找行或列中的True值的数量。

答案 1 :(得分:1)

您是否尝试过DataFrame.dropna()?这不会处理零,但会删除NaN列和行。

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.dropna.html