我需要在2列上执行条件计算。规则是一样的。我一直在使用两个函数,并将它们应用于每一列,如下所示。
df = pd.DataFrame({'Min': [50, 50],
'Max' : [150, 150],
'Rule': ['A', 'B']})
def adjust_min(row):
if row['Rule'] == 'A':
return row['Min'] * 5
elif row['Rule'] == 'B':
return row['Min'] * 10
else:
return row['Min']
def adjust_max(row):
if row['Rule'] == 'A':
return row['Max'] * 5
elif row['Rule'] == 'B':
return row['Max'] * 10
else:
return row['Max']
df['Min'] = df.apply(adjust_min, axis=1)
理想情况下,我想要一个适用于两列的函数,也许:
if row['Rule'] == 'A':
return row * 5
有没有更有效的方法?谢谢!
答案 0 :(得分:1)
将Bill's approach应用于您的问题:
import pandas as pd
def multi_func(f_dict):
def f(row):
return f_dict[row.name](row)
return f
df = pd.DataFrame({'Min': [50, 50],
'Max': [150, 150],
'Rule': ['A', 'B']})
df = df.set_index('Rule')
result = df.apply(multi_func({'A': lambda x: x * 5, 'B': lambda x: x * 10}), axis=1)
导致:
Max Min
Rule
A 750 250
B 1500 500
答案 1 :(得分:1)
矢量化的,您可以将pd.DataFrame.multiply
与字典映射一起使用。由于它利用了Pandas数据帧后面的NumPy数组的连续存储块功能,因此效率更高。 pd.DataFrame.apply
只是一个薄薄的循环,可以更适当地应用于list
而不是数据帧。
df = pd.DataFrame([[50, 150, 'A'],
[50, 150, 'B']],
columns=['Min', 'Max', 'Rule'])
# define dictionary mapping rule to factor
factors_map = {'A': 5, 'B': 10}
# create series of factors mapped from Rule
factors = df['Rule'].map(factors_map).fillna(1)
# multiply selected columns by factors
cols = ['Min', 'Max']
df[cols] = df[cols].multiply(factors, axis=0)
print(df)
Min Max Rule
0 250 750 A
1 500 1500 B
答案 2 :(得分:0)
尝试以下操作:
if row['Rule'] == 'A':
row[["Min", "Max"]] *= 5
elif row['Rule'] == 'B':
row[["Min", "Max"]] *= 10
欢呼