这是一个简单的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
数据可以转到此:
> df.pivot_table(index=['a','b'], columns='c')
d
c c1 c3
a b
a1 optional1 1.0 NaN
a3 optional3 NaN 3.0
下行:由于df['b'][1] == None
,第二行的数据会丢失。
> 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
和第二行保持如下:
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
,如何在轮播期间保留一行信息?
答案 0 :(得分:2)
使用set_index
和unstack
执行支点:
df = df.set_index(['a', 'b', 'c']).unstack('c')
这实际上是大熊猫对pivot
所做的under the hood。 stack
和unstack
方法与pivot
密切相关,通常可用于执行与内置数据透视功能不完全一致的类似枢轴的操作。
结果输出:
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
答案 1 :(得分:0)
您可以使用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
答案 2 :(得分: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'])
答案 3 :(得分:0)
您可以使用fillna将类型None替换为字符串“ NULL”
说... df.fillna(“ NULL”)。pivot_table(index = ['a'],columns ='c')