1

嗨,我正在尝试使用 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)
4

2 回答 2

4

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

如果您确定要删除的所有内容都是文字空字符串(''Nonenp.NaN0并且您不想保留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一个函数(主要基于这个 StackOverflow 关于删除 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将数组从一种类型转换为另一种类型。所以 putastype(bool)意味着它将整个数组转换为Trueor False(分别相当于10),然后您可以求和以查找True行或列中值的数量。

于 2013-05-26T03:49:59.263 回答
1

你试过 DataFrame.dropna() 吗?这不会处理零,但会摆脱 NaN 列和行。

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

于 2013-05-26T02:52:23.407 回答