您好我正在尝试使用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)
答案 0 :(得分:4)
dropna(how='all')
正是您正在寻找的(通常),但您需要加载数据框,以便将空单元格视为NaN
而不是空字符串。也就是说,你有几个选择。
如果您确定要删除的所有内容都是文字空字符串(''
,None
,np.NaN
或0
)和< / 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)
意味着它将整个数组转换为True
或False
(分别相当于1
和0
)然后你就可以了总和以查找行或列中的True
值的数量。
答案 1 :(得分:1)
您是否尝试过DataFrame.dropna()?这不会处理零,但会删除NaN列和行。
http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.dropna.html