有条件地组合pandas数据帧中的列

时间:2013-04-22 03:51:56

标签: python pandas

我有一个看起来像这样的DataFrame:

   x1  x2 
0   4   1 
1   0   2 
2   5   1 
3   0   3 
4   4   2 

现在我想要创建另一列,其中列x1x2的列平均值,如果0x1,则返回0

   x1  x2  ave
0   4   1  2.5 
1   0   2  0
2   5   1  3 
3   0   3  0
4   4   2  3

这两个

data['ave'] = (data['x1'] + data['x2'])/2 if data['x1'] > 0 else 0

也不是这个

data['ave'] = (data['x1'] != 0)*(data['x1'] + data['x2'])/2

起作用的原因很明显(系列不能用于这些操作)。

我知道使用循环很容易实现,但是有一种简化的pythonic方式吗?

正确的python数据如下:

data = pd.DataFrame({'x1': (4,0,5,0,4), 'x2': (1,2,1,3,2)})

1 个答案:

答案 0 :(得分:3)

你非常接近。您的两种方法都应该只使用一两个调整。方法#1:

>>> df = pd.DataFrame({'x1': (4,0,5,0,4), 'x2': (1,2,1,3,2)})
>>> df["ave"] = (df["x1"] != 0) * (df["x1"] + df["x2"])/2.
>>> df
   x1  x2  ave
0   4   1  2.5
1   0   2  0.0
2   5   1  3.0
3   0   3  0.0
4   4   2  3.0

如果你不在.中的2.并且你的列是整数,那么由于整数除法,你可能无法获得预期的结果,但Series可以毫无问题地使用

方法#2:

df["ave"] = df.apply(lambda r: (r["x1"] + r["x2"])/2. if r["x1"] > 0 else 0, axis=1)

将函数传递给apply并指定axis=1

方法#3a,3b:

df["ave"] = df.mean(axis=1) * (df["x1"] != 0)

df["ave"] = df[["x1", "x2"]].mean(axis=1)
df["ave"][df["x1"] == 0] = 0

等等。