pandas Python对0级列执行自定义计算

oaxa6hgo  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(305)

我有一个数据框:

import pandas as pd

df = pd.DataFrame({
    ('A', 'a'): [1, 2, 3],
    ('A', 'b'): [4, 5, 6],
    ('B', 'a'): [7, 8, 9],
    ('B', 'b'): [10, 11, 12],
})
df

我想对每个零级中的每一列执行定义的计算,并输出另一个零级标签“C”。
我想做A * B/ 2
产生 Dataframe 输出:

df = pd.DataFrame({
    ('A', 'a'): [1, 2, 3],
    ('A', 'b'): [4, 5, 6],
    ('B', 'a'): [7, 8, 9],
    ('B', 'b'): [10, 11, 12],
    ('C', 'a'): [3.5, 8, 13.5],
    ('C', 'b'): [20, 27.5, 36],
})
df

我最初的想法是在level=0,axis=1上执行一个.groupby函数,然后使用.apply()函数。

bd1hkmkf

bd1hkmkf1#

对于stack/unstackeval

out = df.stack().eval("C = A * B / 2").unstack()

输出:

print(out)

   A     B         C
   a  b  a   b     a     b
0  1  4  7  10   3.5  20.0
1  2  5  8  11   8.0  27.5
2  3  6  9  12  13.5  36.0
7ivaypg9

7ivaypg92#

您可以只执行所需的计算-即(df['A'] * df['B']).div(2),然后将值赋给原始DataFrame中的新列。

df[[('C', 'a'), ('C', 'b')]] = (df['A'] * df['B']).div(2)

   A     B         C      
   a  b  a   b     a     b
0  1  4  7  10   3.5  20.0
1  2  5  8  11   8.0  27.5
2  3  6  9  12  13.5  36.0
2izufjch

2izufjch3#

下面是另一种方法:

pd.concat([df,pd.concat([df.groupby(level=1,axis=1).prod().div(2)],keys =['C'],axis=1)],axis=1)

输出:

A     B         C      
   a  b  a   b     a     b
0  1  4  7  10   3.5  20.0
1  2  5  8  11   8.0  27.5
2  3  6  9  12  13.5  36.0

相关问题