【发布时间】:2021-11-20 22:16:17
【问题描述】:
我有以下工作代码,可以创建一些简单的数学函数和一个带有多索引列的 DataFrame。我想有条件地对其应用一些功能。
import pandas as pd
import numpy as np
# Simple maths functions ---
def add(scalars): return sum(scalars) #Adds every element in scalars
def sub(scalars): return (scalars[0] - sum(scalars[1:])) #First scalar value subtracted by the rest of the scalar list
def mul(scalars): return np.prod(scalars) #Multiplies every element in scalars
def divi(scalars): return (scalars[0] / np.prod(scalars[1:])) #First scalar value divided by the rest product of the scalar list
# Create df ---
operatorList = [add, sub, mul, divi] # List of our maths functions
names = ['add', 'sub', 'mul', 'divi'] # List of the names of our maths functions
size = 4
tups = [('scalars', 'add', 'sc0'), ('scalars', 'add', 'sc1'), ('scalars', 'add', 'sc2'), ('scalars', 'sub', 'sc0'), ('scalars', 'sub', 'sc1'), ('scalars', 'mul', 'sc0'), ('scalars', 'mul', 'sc1'), ('scalars', 'mul', 'sc2'), ('scalars', 'divi', 'sc0'), ('scalars', 'divi', 'sc1'), ('operator', '', '')]
df = pd.DataFrame(columns=pd.MultiIndex.from_tuples(tups))
df['operatorIndex'] = np.random.randint(0, len(names), size)
df['operator'] = df['operatorIndex'].apply(lambda x: str(names[x]))
groupSize = 2
df['ID']=np.divmod(np.arange(len(df)),groupSize)[0]+1
df.set_index('ID', inplace=True)
df.sort_index(inplace=True)
for name in names:
df.loc[(df['operator'] == name), ('scalars', name, df.columns.levels[2])] = np.random.randint(0, 10)
> df
scalars operator operatorIndex
add sub mul divi
sc0 sc1 sc2 sc0 sc1 sc0 sc1 sc2 sc0 sc1
ID
1 4 4 4 NaN NaN NaN NaN NaN NaN NaN add 0
1 NaN NaN NaN 7 7 NaN NaN NaN NaN NaN sub 1
2 NaN NaN NaN NaN NaN 3 3 3 NaN NaN mul 2
2 NaN NaN NaN 7 7 NaN NaN NaN NaN NaN sub 1
如何创建一个名为Evaluation 的新列,它是每列的正确数学函数的结果? operator 列告诉每一行需要应用哪个函数。
示例目标 df 如下所示:
> df
scalars operator operatorIndex Evaluation
add sub mul divi
sc0 sc1 sc2 sc0 sc1 sc0 sc1 sc2 sc0 sc1
ID
1 4 5 6 NaN NaN NaN NaN NaN NaN NaN add 0 15
1 NaN NaN NaN 7 2 NaN NaN NaN NaN NaN sub 1 5
2 NaN NaN NaN NaN NaN 1 2 3 NaN NaN mul 2 6
2 NaN NaN NaN 5 9 NaN NaN NaN NaN NaN sub 1 -4
【问题讨论】:
-
您在一个问题中提出了两个问题 - 请针对每个问题提出两个单独的 SO 问题。 :)
标签: python pandas dataframe numpy