【发布时间】:2020-03-24 11:20:49
【问题描述】:
我正在使用 np.NaN 值旋转一个表,这些值我希望在转换后保留,目前还没有发生。
鉴于下表:
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
"bar", "bar", "bar", "bar"],
"B": ["one", "one", "one", "two", "two",
"one", "one", "two", "two"],
"C": ["small", "large", "large", "small",
"small", "large", "small", "small",
"large"],
"D": [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 7],
"E": [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]})
现在应用数据透视表:
table = pd.pivot_table(df, values='D', index=['A', 'B'],
columns=['C'], aggfunc=np.sum, fill_value='HAHA').reset_index()
我得到的输出:
C A B large small
0 bar one 0 0.0
1 bar two 7 0.0
2 foo one 0 0.0
3 foo two HAHA 0.0
我期待的输出:
C A B large small
0 bar one HAHA HAHA
1 bar two 7 HAHA
2 foo one HAHA HAHA
3 foo two HAHA HAHA
问题: 为什么 pivot_table 方法只填充组“foo - two - large”,而其他组没有保留其 np.NaN,而是将其替换为零?
【问题讨论】:
-
它按设计工作;
np.NaN元素的总和为 0 (df['E'].sum()==0),它只会填充您的数据透视图中根本不存在的元素,这是您输出中唯一将为 nan 的元素 -
这能回答你的问题吗? Sum across all NaNs in pandas returns zero?
-
没错,我还没有意识到在这种情况下缺少组“foo - two - large”。我最初的想法是:因为下面的代码“np.sum([np.nan, np.nan])”给出了“nan”作为结果。我认为在这种方法中使用它时也会发生同样的情况。你知道为什么没有吗?
-
在链接问题中引用的文档中,将其设为熊猫中的默认值似乎只是一个设计决定。我不知道确切地说为什么输出默认为
0而不是nan -
@AfonsoSchulzAlbrecht 这是一个非常微妙的实施决策。基本上,当您将
np.sum作为 aggfunc 传递时,pandas 会忽略它,而是使用 getattr(Series, 'sum')。它超级隐藏在源代码中,但在我的解决方案结束时,我放入了用于执行此“调度”的表。 np.sum、np.nansum 和 sum 都被分派到 DataFrame 或 Series 的 sum 属性。稍微相关:stackoverflow.com/questions/60647377/…