关于pandas中grouped[l].size()结果的两处疑问求助
关于pandas中
groupby['l'].size()的疑问 先看这段代码:
f = 10 n = 250 np.random.seed(100) x = np.random.randint(0,2,(n,f)) y = np.random.randint(0,2,n) fcols = [f'f{_}' for _ in range(f)] data = pd.DataFrame(x, columns = fcols) data['l'] = y grouped = data.groupby(list(data.columns)) print(grouped['l'].size())
运行后输出:
f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 l 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 .. 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 2 Name: l, Length: 239, dtype: int64
存在两个困惑:
l的取值仅为0或1,原以为分组后结果长度应为2,为何实际是239?- 输出中多个f列显示为空值,这是为什么?
问题1解答
你这里的分组依据是所有列(list(data.columns)包含了f0到f9以及l列),不是只按l列分组。pandas会把所有f列取值完全相同且l值也相同的行归为一组。
因为你生成的是250行含10个0/1特征列+1个0/1标签列的随机数据,大部分行的「特征组合+标签」都是唯一的,只有少数组合重复出现,所以最终分组数是239(说明有11组是重复的,比如最后一行的size=2,代表该组合出现了2次)。如果要仅按l分组,代码需改成grouped = data.groupby('l'),此时结果长度就是2,对应l=0和l=1两组的总行数。
问题2解答
输出里的“空白”不是真的空值,是pandas的分层索引缩进优化显示。当相邻行的某一列索引值和上一行完全相同时,pandas会省略重复值,用空白代替,让输出更简洁易读。
比如第二行的f0到f4列和第一行完全一致(都是0),所以这些列就显示空白,只展示变化的f5到l列的值。你可以用grouped['l'].size().reset_index()把分层索引转为普通DataFrame,就能看到每一行的所有列都有完整的0/1取值。
内容的提问来源于stack exchange,提问作者Tiina
相关产品推荐
相关产品推荐

