如何修正Pandas代码,获取count最高且missing_values最小的行?
问题与解决方法
数据样本
missing_values count 0 51 3 1 12 12 13 1 15 1 16 1 21 1 35 2 36 3 40 1
原代码
# Get the count of each missing value missing_value_count = missing_values.iloc[:, 0:1].value_counts().to_frame() missing_value_count.sort_index(inplace=True) missing_value_count.to_csv('question.csv') missing_value_count.agg(lambda s: pd.Series([*s.nlargest().index, *s.nsmallest().index], ['missing_values']), axis='columns')
运行错误
missing_value_count.agg(lambda s: pd.Series([*s.nlargest().index, *s.nsmallest().index], ['missing_values']), axis='columns') Traceback (most recent call last): Cell In[29], line 1 missing_value_count.agg(lambda s: pd.Series([*s.nlargest().index, *s.nsmallest().index], File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\frame.py:9196 in aggregate result = op.agg() File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\apply.py:699 in agg result = self.obj.apply(self.orig_f, axis, args=self.args, **self.kwargs) File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\frame.py:9423 in apply return op.apply().__finalize__(self, method="apply") File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\apply.py:678 in apply return self.apply_standard() File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\apply.py:798 in apply_standard results, res_index = self.apply_series_generator() File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\apply.py:814 in apply_series_generator results[i] = self.f(v) Cell In[29], line 1 in <lambda> missing_value_count.agg(lambda s: pd.Series([*s.nlargest().index, *s.nsmallest().index], File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\series.py:500 in __init__ com.require_length_match(data, index) File D:\Users\Mahmoud\anaconda3\Lib\site-packages\pandas\core\common.py:576 in require_length_match raise ValueError( ValueError: Length of values (2) does not match length of index (1)
需求
需要返回count值最高且missing_values最小的行,对应样本数据的结果应为:
missing_values count 0 51
解决方法
你的错误根源在于agg配合axis='columns'时,是对每一行执行lambda,但你试图返回长度为2的Series,和原行的索引长度(1)不匹配,完全不符合需求逻辑。
要实现需求,不需要用agg,直接按以下步骤处理:
- 先按
count列降序排序,确保count最高的行排在前面 - 再按
missing_values列升序排序,确保在count相同的情况下,取missing_values最小的行 - 取排序后的第一行即可
修正后的代码如下:
# Get the count of each missing value missing_value_count = missing_values.iloc[:, 0:1].value_counts().to_frame() missing_value_count.sort_index(inplace=True) missing_value_count.to_csv('question.csv') # 修正部分:获取count最高且missing_values最小的行 result = missing_value_count.sort_values(by=['count', 'missing_values'], ascending=[False, True]).head(1) print(result)
如果你的missing_value_count的索引就是missing_values(因为用了value_counts()后索引是原列的值),那代码可以简化为:
result = missing_value_count.sort_values(by='count', ascending=False).sort_index().head(1)
两种方式都能得到你需要的结果:
missing_values count 0 51
内容的提问来源于stack exchange,提问作者mahmoud988
相关产品推荐
相关产品推荐

