根据另一个df列的值范围设置熊猫df列的值

时间:2019-11-13 03:04:32

标签: python pandas

我有一个如下所示的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

4 个答案:

答案 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)