我尝试pivot
在数据框上使用后创建一个由3个子列组成的新列组,但结果只有一列。
假设我具有以下数据框:
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
'two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6],
'zoo': [1, 2, 3, 4, 5, 6]})
df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])
现在我想要一个额外的列组,它是两个值列baz和zoo的总和。
我的输出:
df.loc[:, "baz+zoo"] = df.loc[:,'baz'] + df.loc[:,'baz']
所需的输出:
我知道先进行求和然后进行级联就可以解决问题,但是我希望找到一个更整洁的解决方案。
我认为如果多行或主要是多列是更好/更快,则创建newDataFrame
并添加MultiIndex
by的第一级,MultiIndex.from_product
并通过by添加到original DataFrame.join
:
df1 = df.loc[:,'baz'] + df.loc[:,'zoo']
df1.columns = pd.MultiIndex.from_product([['baz+zoo'], df1.columns])
print (df1)
baz+zoo
A B C
foo
one 2 4 6
two 8 10 12
df = df.join(df1)
print (df)
baz zoo baz+zoo
bar A B C A B C A B C
foo
one 1 2 3 1 2 3 2 4 6
two 4 5 6 4 5 6 8 10 12
另一个解决方案是按第二级循环并按MultiIndex
元组选择,但是如果较大的DataFrame性能应该更差,则最好使用真实数据进行测试:
for x in df.columns.levels[1]:
df[('baz+zoo', x)] = df[('baz', x)] + df[('zoo', x)]
print (df)
baz zoo baz+zoo
bar A B C A B C A B C
foo
one 1 2 3 1 2 3 2 4 6
two 4 5 6 4 5 6 8 10 12
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句