1

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

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

现在我想创建另一个列,它取列的平均值,x1如果是,则x2返回:0x10

   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)})
4

1 回答 1

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

如果您省略.in2.并且您的列是整数,则由于整数除法,您可能无法获得预期的结果,但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

等等。

于 2013-04-22T04:03:14.543 回答