删除行和 ValueError 数组的长度不同

Posted

技术标签:

【中文标题】删除行和 ValueError 数组的长度不同【英文标题】:remove rows and ValueError Arrays were different lengths 【发布时间】:2018-03-21 05:02:19 【问题描述】:

我的数据框有子类别,在每个类别(catdogbird)下,都会显示统计信息。如果它们包含countfreq 中的信息,我需要删除这些行,并且只保留具有sdmean 值的行。一些值为NaN

ValueError 出现在我的代码中。

df:

 var    stats    A     B     C
 cat     mean    2     3     4
 NaN     sd      2     1     3
 NaN     count   5     2     6
 NaN     freq    3     1     19
 dog     mean    8     1     2
 NaN     sd      2     1     3
 NaN     count   4     6     1
 NaN     freq    3     1     19   
 bird    mean    2     3     4
 NaN     sd      2     1     3
 NaN     count   5     2     6
 NaN     freq    NaN   NaN   NaN 

我的代码:

rows = ['count', 'freq']
df = [df.stats != rows]

预期结果

 var    stats    A     B     C
 cat     mean    2     3     4
 NaN     sd      2     1     3
 dog     mean    8     1     2
 NaN     sd      2     1     3   
 bird    mean    2     3     4
 NaN     sd      2     1     3

错误:

File "pandas/_libs/lib.pyx", line 805, in pandas._libs.lib.vec_compare 
(pandas/_libs/lib.c:14288)
ValueError: Arrays were different lengths: 819 vs 9

我不确定如何检查数组长度,但在我的 excel 电子表格中,所有列和行的长度都相同。这个错误是由我的数据中的 NaN/空单元格引起的吗?

谢谢!

【问题讨论】:

【参考方案1】:

!= 在这里不起作用。使用pd.Series.isin 获取一个掩码,然后您将使用它来过滤您的数据框。

m = ~df.stats.isin(['count', 'freq'])
print(m)
0      True
1      True
2     False
3     False
4      True
5      True
6     False
7     False
8      True
9      True
10    False
11    False
Name: stats, dtype: bool

print(df[m])
    var stats    A    B    C
0   cat  mean  2.0  3.0  4.0
1   NaN    sd  2.0  1.0  3.0
4   dog  mean  8.0  1.0  2.0
5   NaN    sd  2.0  1.0  3.0
8  bird  mean  2.0  3.0  4.0
9   NaN    sd  2.0  1.0  3.0

【讨论】:

谢谢! ~ 是否与!= 相似?我什么时候应该使用!= @Kay != 是二元运算符,~ 是一元运算符,pandas 重载用于否定布尔值。【参考方案2】:

你可以使用类似 SQL 的 query() 方法:

In [163]: df.query("stats not in ['count','freq']")
Out[163]:
    var stats    A    B    C
0   cat  mean  2.0  3.0  4.0
1   NaN    sd  2.0  1.0  3.0
4   dog  mean  8.0  1.0  2.0
5   NaN    sd  2.0  1.0  3.0
8  bird  mean  2.0  3.0  4.0
9   NaN    sd  2.0  1.0  3.0

或使用您的 rows 变量:

In [164]: df.query("stats not in @rows")
Out[164]:
    var stats    A    B    C
0   cat  mean  2.0  3.0  4.0
1   NaN    sd  2.0  1.0  3.0
4   dog  mean  8.0  1.0  2.0
5   NaN    sd  2.0  1.0  3.0
8  bird  mean  2.0  3.0  4.0
9   NaN    sd  2.0  1.0  3.0

【讨论】:

不错的一个。您是否还要添加一个在外部声明列表并用@引用的变量的示例?【参考方案3】:

为了好玩!

rows = ['count', 'freq']

df.merge(pd.DataFrame(dict(stats=np.setdiff1d(df.stats, rows))))

    var stats    A    B    C
0   cat  mean  2.0  3.0  4.0
1   dog  mean  8.0  1.0  2.0
2  bird  mean  2.0  3.0  4.0
3   NaN    sd  2.0  1.0  3.0
4   NaN    sd  2.0  1.0  3.0
5   NaN    sd  2.0  1.0  3.0

indexdrop 的另一种有趣方式

df.set_index('stats').drop(rows).reset_index()

  stats   var    A    B    C
0  mean   cat  2.0  3.0  4.0
1    sd   NaN  2.0  1.0  3.0
2  mean   dog  8.0  1.0  2.0
3    sd   NaN  2.0  1.0  3.0
4  mean  bird  2.0  3.0  4.0
5    sd   NaN  2.0  1.0  3.0

【讨论】:

【参考方案4】:

哈哈 :)

df[[x not in rows for x in df.stats]]
Out[520]: 
    var stats    A    B    C
0   cat  mean  2.0  3.0  4.0
1   NaN    sd  2.0  1.0  3.0
4   dog  mean  8.0  1.0  2.0
5   NaN    sd  2.0  1.0  3.0
8  bird  mean  2.0  3.0  4.0
9   NaN    sd  2.0  1.0  3.0

【讨论】:

以上是关于删除行和 ValueError 数组的长度不同的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 和 JSON ValueError:数组的长度必须相同

不同长度的pandas groupby元组-ValueError:在通过级别中找不到值:MultiIndex

ValueError:使用字典时无法将不匹配长度分配给掩码数组

Mask-RCNN,ValueError:无法将输入数组从形状(70)广播到形状(1)

ValueError:检查输入时出错:预期的dense_26_input具有形状(45781,)但得到的数组具有形状(2,)

将两个不同形状的numpy数组合并到一个数组中