基于Pandas中具有条件的行的新列

时间:2017-11-23 09:27:55

标签: python-3.x pandas dataframe

我正在尝试使用Dataframes进行操作,但我不确定如何使用内置的Pandas Operations解决问题(Actualy我的代码是基于一个for,所以我试图建立一个更多优雅的解决方案) 给定以下数据帧,使用下面描述的列定义

original_df = [o1, o2, o3, o4]
weights_df = [w1, w2, w3, w4]
conditions_df = [c1, c2, c3, c4]

我需要根据 o1 / w1 的划分在 original_df 上构建一个新列,但取决于 c1 的值,取值[“+”或“ - ”我需要进行 -o1 / w1 操作。

只要我这样做:

orignal_df['newcolumn'] = original_df / weights_df

当然,我将这两个术语分开但没有应用条件,我正在尝试使用map和apply函数,但我不确定如何将第三列添加到函数中。

2 个答案:

答案 0 :(得分:1)

original_df = [100, 200, 300, 400]
weights_df = [10, 20, 30, 40]
conditions_df = [1, 2, 3, 4]

df = pd.DataFrame({'x':original_df, 'y':weights_df, 'z':conditions_df})
def div(x, y, z):
    if z > 2:
        return float(x/y)
    else:
        return float(-1*x/y)

df['new_feature'] = df.apply(lambda p: div(p['x'], p['y'], p['z']), axis=1)

这是一种解决方法。如果您的conditions_df包含“+”/“ - ”,那么您可以相应地更改def div(x, y, z)中的条件。

答案 1 :(得分:0)

您可以按条件使用numpy.where进行掩码:

#data from lisa answer
#df = pd.DataFrame({'x':original_df, 'y':weights_df, 'z':conditions_df})

df['new_feature'] = df['x'] / df['y'] *  np.where(df['z'] > 2, 1, -1)
print (df)
     x   y  z  new_feature
0  100  10  1        -10.0
1  200  20  2        -10.0
2  300  30  3         10.0
3  400  40  4         10.0

<强>计时

#4k rows
df = pd.concat([df]*1000).reset_index(drop=True)

#lisa answer
In [95]: %timeit df['new_feature1'] = df.apply(lambda p: div(p['x'], p['y'], p['z']), axis=1)
10 loops, best of 3: 123 ms per loop

In [96]: %timeit df['new_feature2'] = df['x'] / df['y'] *  np.where(df['z'] > 2, 1, -1)
1000 loops, best of 3: 595 µs per loop