我有一个如下所示的df:
df = pd.DataFrame({'a':[-3,-2,-1,0,1,2,3], 'b': [1,2,3,4,5,6,7]})
我想创建一个列'c',它查看'a'的值以确定对'b'进行什么操作并将其显示在新列'c'中。
我有一个使用iterrow的解决方案,但是,我的实际df很大,iterrows的效率很低。
我想做的是以矢量形式执行此操作。 我的“慢”解决方案是:
df['c'] = 0
for index, row in df.iterrows():
if row['a'] <=-2:
row['c'] = row['b']*np.sqrt(row[b]*row[a])
if row['a'] > -2 and row['a'] < 2:
row['c'] = np.log(row['b'])
if row['a'] >= 2:
row['c'] = row['b']**3
答案 0 :(得分:2)
使用np.select。这是向量化操作。
conditions = [
df['a'] <= -2,
(df['a'] > -2) & (df['a'] < 2),
df['a'] >= 2
]
values = [
df['b'] * np.sqrt(df['b'] * df['a'])
np.log(df['b']),
df['b']**3
]
df['c'] = np.select(conditions, values, default=0)
答案 1 :(得分:1)
您可以对带有lambda函数的熊猫(指定轴= 1)中的多列使用和.apply来完成工作。不确定速度是否正常。参见以下示例:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[-3,-2,-1,0,1,2,3], 'b': [1,2,3,4,5,6,7]})
def func(a_, b_):
if a_<=-2:
return b_*(b_*a_)**0.5
elif a_<2:
return np.log(b_)
else:
return b_**3.
df['c'] = df[['a','b']].apply(lambda x: func(x[0], x[1]), axis=1)
答案 2 :(得分:0)
df['c'] = df.apply(lambda x: my_func(x), 1)
def my_func(x):
if x['a'] <= -2:
return x['b']*np.sqrt(x[b]*x[a])
# write other conditions as needed
df.apply
函数遍历数据帧的每一行并应用传递的函数(即lambda function
)。第二个参数是axis,它设置为1,这意味着它将迭代行,并且行值将传递到lambda
函数中。默认情况下为0,在这种情况下,它将遍历列。
最后,您需要返回一个值,该值将被设置为列“ c”值。
答案 3 :(得分:0)
一种方法是按条件建立索引,然后仅对那些行进行操作。像这样:
df['c'] = np.nan
indices = [
df['a'] <= -2,
(df['a'] > -2) & (df['a'] < 2),
df['a'] >= 2
]
ops = [
lambda x: x['b'] * np.sqrt(x['b'] * x['a']),
lambda x: np.log(x['b']),
lambda x: x['b']**3
]
for ix, op in zip(indices, ops):
df.loc[ix, 'c'] = op(df)