我最近遇到了一个大型数据集中的情况,其中我的一个groupby
系列包含一些np.nan
值。这会导致观察结果从结果表中删除。在高维情况下(> 100,000行),这有时难以识别,这导致系统的数据丢失。我现在变得更专注于我的groupby项目,并使用最小索引信息来识别sum()
之前的唯一案例。
一个简单的例子:
import pandas as pd
import numpy as np
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
'foo', 'foo', 'qux', 'qux'],
[np.nan, np.nan, 'one', 'two',
'one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
np.random.seed(1234)
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
生成以下DataFrame
执行GroupBy
操作时
df2 = df.reset_index()
df2.groupby(['first', 'second']).sum()
#OR
df.groupby(level=['first', 'second']).sum()
我们得到了结果DataFrame
这从default
的角度来看是很有道理的(由于信息不完整),但是选择不丢弃bar
并保留数据是很好的,在这种情况下会返回original dataframe
。
这种情况出现在我的数据中,因为我有一个冗余的索引项,在MultiIndex
的较低级别没有变化,所以我认为它不会很好(因为它很好保留在数据集中作为另一个索引项的不同表示形式:它是FullCountryName
和ISO3C
代码),但是我发现因为它没有在一个国家/地区的情况下定义它因此被删除结果数据框中的那个国家(没有任何警告)。
有没有办法实现这个结果?
如果由于warning
在任何级别存在而导致群组丢弃,则可能会发出np.nan
。
这可能会使其更清晰:
import pandas as pd
import numpy as np
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
'foo', 'foo', 'qux', 'qux',],
['one', 'two', 'one', 'two',
'one', 'two', 'one', 'two'],
[np.nan, np.nan, 'one', 'two',
'one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second', 'third'])
np.random.seed(1234)
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
生成以下数据框
然后
df.groupby(level=['first', 'second', 'third']).sum()
产生
third
级别在groupby的唯一性中并不重要。