如何将NaN保留在数据透视表中?

时间:2019-07-04 14:32:59

标签: python pandas numpy

在更改数据框的形状时希望保留NaN值。

这两个问题可能有关:

但无法使用提供的答案-我可以通过某种方式设置np.sum的最小计数吗?

import pandas as pd
import numpy as np
df = pd.DataFrame([['Y1', np.nan], ['Y2', np.nan], ['Y1', 6], ['Y2',8]], columns=['A', 'B'], index=['1988-01-01','1988-01-01', '1988-01-04', '1988-01-04'])
df.index.name = 'Date'
df

pivot_df = pd.pivot_table(df, values='B', index=['Date'], columns=['A'],aggfunc=np.sum)
pivot_df

输出为:

A   Y1  Y2
Date        
1988-01-01  0.0 0.0
1988-01-04  6.0 8.0

,所需的输出是:

A   Y1  Y2
Date        
1988-01-01  NaN NaN
1988-01-04  6.0 8.0

5 个答案:

答案 0 :(得分:1)

在这种情况下,我将以groupby解决:

(df.groupby(['Date', 'A']).B
   .apply(lambda x: np.nan if x.isna().all() else x.sum())
   .unstack('A')
)

输出:

A            Y1   Y2
Date                
1988-01-01  NaN  NaN
1988-01-04  6.0  8.0

如有必要,将isna().all()更改为isna().any()

答案 1 :(得分:1)

从有用的评论中,以下解决方案符合我的要求:


pivot_df_2 = pd.pivot_table(df, values='B', index=['Date'], columns=['A'],aggfunc=min, dropna=False)
pivot_df_2

每个插槽的值都应该是唯一的,所以用min函数替换sum函数不会有任何区别(在我的情况下)

答案 2 :(得分:1)

可以对值进行计数,并在0(或小于预期值)时下降:

pivot_df = pd.pivot_table(df, values='B', index=['Date'], columns=['A'],
                          aggfunc=['sum','count'])

# build the mask from count
mask = (pivot_df.xs('count', axis=1) == 0)   # or ...<min_limit

#build the actual pivot_df from sum
pivot_df = pivot_df.xs('sum', axis=1)

# and reset to NaN when not enough values
pivot_df[mask] = np.nan

它给出了预期的结果:

A            Y1   Y2
Date                
1988-01-01  NaN  NaN
1988-01-04  6.0  8.0

当您加总一个以上的值时,此结果将给出明智的结果。

答案 3 :(得分:1)

如果没有重复的条目,请使用g.V().has("veguid","530ad56bc-f554-4a79-bd87-b69f9f792612").repeat(__.both() .simplePath()) .until(__.has("name","F").or().loops().is(eq(7))).path() + set_index

unstack

df.set_index('A', append=True)['B'].unstack(-1)

如果重复,请将A Y1 Y2 Date 1988-01-01 NaN NaN 1988-01-04 6.0 8.0 groupby一起使用

min_count

>> df

             A    B
Date
1988-01-01  Y1  NaN
1988-01-01  Y2  NaN
1988-01-04  Y1  6.0
1988-01-04  Y2  8.0
1988-01-01  Y1  NaN
1988-01-01  Y2  NaN
1988-01-04  Y1  6.0
1988-01-04  Y2  8.0

df.set_index('A', append=True).groupby(level=[0, 1])['B'].sum(min_count=1).unstack(-1)

答案 4 :(得分:1)

尝试将'dropna= False'添加到您的数据透视表函数中吗?