pivot_table 索引中的 NaN 值导致数据丢失
NaN values in pivot_table index causes loss of data
这是一个简单的 DataFrame:
> df = pd.DataFrame({'a': ['a1', 'a2', 'a3'],
'b': ['optional1', None, 'optional3'],
'c': ['c1', 'c2', 'c3'],
'd': [1, 2, 3]})
> df
a b c d
0 a1 optional1 c1 1
1 a2 None c2 2
2 a3 optional3 c3 3
透视方法 1
数据可以转为:
> df.pivot_table(index=['a','b'], columns='c')
d
c c1 c3
a b
a1 optional1 1.0 NaN
a3 optional3 NaN 3.0
缺点:第 2 行的数据丢失,因为 df['b'][1] == None
。
透视方法 2
> df.pivot_table(index=['a'], columns='c')
d
c c1 c2 c3
a
a1 1.0 NaN NaN
a2 NaN 2.0 NaN
a3 NaN NaN 3.0
缺点:第 b
列丢失。
如何结合这两种方法,使第 b
列和第 2 行保持如下:
d
c c1 c2 c3
a b
a1 optional1 1.0 NaN NaN
a2 None NaN 2.0 NaN
a3 optional3 NaN NaN 3.0
更一般地:如果键具有 NaN
值,如何在旋转期间保留行中的信息?
您可以使用 fillna
替换 None
条目:
df['b'] = df['b'].fillna('foo')
df.pivot_table(index=['a','b'], columns=['c'])
----
d
c c1 c2 c3
a b
a1 optional1 1.0 NaN NaN
a2 foo NaN 2.0 NaN
a3 optional3 NaN NaN 3.0
使用set_index
和unstack
执行枢轴:
df = df.set_index(['a', 'b', 'c']).unstack('c')
这基本上就是 pandas 为 pivot
所做的 under the hood。 stack
和 unstack
方法与 pivot
密切相关,通常可用于执行不太符合 built-in 枢轴的 pivot-like 操作函数。
结果输出:
d
c c1 c2 c3
a b
a1 optional1 1.0 NaN NaN
a2 NaN NaN 2.0 NaN
a3 optional3 NaN NaN 3.0
使用这个:
def pivot_table(df, index, columns, values):
df = df[index + columns + values]
i = len(index)
df = df.set_index(index+columns).unstack(columns).reset_index()
df.columns = df.columns.droplevel(1)[:i].append(df.columns.droplevel(0)[i:])
return df
pivot_table(df, index =['a', 'b'], columns= ['c'], values= ['d'])
您可以使用 fillna 将类型 None 替换为字符串“NULL”
说...
df.fillna("NULL").pivot_table(索引=['a'], 列='c')
这是一个简单的 DataFrame:
> df = pd.DataFrame({'a': ['a1', 'a2', 'a3'],
'b': ['optional1', None, 'optional3'],
'c': ['c1', 'c2', 'c3'],
'd': [1, 2, 3]})
> df
a b c d
0 a1 optional1 c1 1
1 a2 None c2 2
2 a3 optional3 c3 3
透视方法 1
数据可以转为:
> df.pivot_table(index=['a','b'], columns='c')
d
c c1 c3
a b
a1 optional1 1.0 NaN
a3 optional3 NaN 3.0
缺点:第 2 行的数据丢失,因为 df['b'][1] == None
。
透视方法 2
> df.pivot_table(index=['a'], columns='c')
d
c c1 c2 c3
a
a1 1.0 NaN NaN
a2 NaN 2.0 NaN
a3 NaN NaN 3.0
缺点:第 b
列丢失。
如何结合这两种方法,使第 b
列和第 2 行保持如下:
d
c c1 c2 c3
a b
a1 optional1 1.0 NaN NaN
a2 None NaN 2.0 NaN
a3 optional3 NaN NaN 3.0
更一般地:如果键具有 NaN
值,如何在旋转期间保留行中的信息?
您可以使用 fillna
替换 None
条目:
df['b'] = df['b'].fillna('foo')
df.pivot_table(index=['a','b'], columns=['c'])
----
d
c c1 c2 c3
a b
a1 optional1 1.0 NaN NaN
a2 foo NaN 2.0 NaN
a3 optional3 NaN NaN 3.0
使用set_index
和unstack
执行枢轴:
df = df.set_index(['a', 'b', 'c']).unstack('c')
这基本上就是 pandas 为 pivot
所做的 under the hood。 stack
和 unstack
方法与 pivot
密切相关,通常可用于执行不太符合 built-in 枢轴的 pivot-like 操作函数。
结果输出:
d
c c1 c2 c3
a b
a1 optional1 1.0 NaN NaN
a2 NaN NaN 2.0 NaN
a3 optional3 NaN NaN 3.0
使用这个:
def pivot_table(df, index, columns, values):
df = df[index + columns + values]
i = len(index)
df = df.set_index(index+columns).unstack(columns).reset_index()
df.columns = df.columns.droplevel(1)[:i].append(df.columns.droplevel(0)[i:])
return df
pivot_table(df, index =['a', 'b'], columns= ['c'], values= ['d'])
您可以使用 fillna 将类型 None 替换为字符串“NULL”
说... df.fillna("NULL").pivot_table(索引=['a'], 列='c')