[Pandas]基于if语句分配新列的方法

时间:2016-10-10 20:05:43

标签: python pandas dataframe

我知道assign可以帮助创建/更改一个基于lambda函数的列,如下所示:

df.assign(c = lambda x: x.sum())

但如果我想让语句内联而不是在操作之外单独执行,那么我无法找到使用if语句执行此操作的方法。

是否有可能在不执行任何操作的情况下实现此目的:

df.assign(c = lambda x: x.num_col.sum() if x.num_col > 0)

以上命令返回" SyntaxError :语法无效"

2 个答案:

答案 0 :(得分:2)

IIUC你可以这样做:

数据:

?wsdl

让我们在In [6]: df = pd.DataFrame(np.random.randn(10,2),columns=list('ab')) In [7]: df Out[7]: a b 0 0.493970 1.095644 1 0.128510 -0.542144 2 0.136247 -0.544499 3 -0.540835 -0.100574 4 0.052725 -0.164856 5 -1.201619 1.578153 6 1.921872 0.505875 7 -2.519725 0.282050 8 -1.581868 -0.240352 9 -0.071207 -1.366953 In [8]: df.iloc[:6] Out[8]: a b 0 0.493970 1.095644 1 0.128510 -0.542144 2 0.136247 -0.544499 3 -0.540835 -0.100574 4 0.052725 -0.164856 5 -1.201619 1.578153 6 1.921872 0.505875 列中找到索引的正值之和:a

[0:6]

<强>解决方案:

In [9]: df.iloc[:6].query('a > 0').a.sum()
Out[9]: 2.733322288547374

与重命名的列相同:

In [10]: df.iloc[:6].assign(c=lambda x: x.query('a > 0').a.sum())
Out[10]:
          a         b         c
0  0.493970  1.095644  2.733322
1  0.128510 -0.542144  2.733322
2  0.136247 -0.544499  2.733322
3 -0.540835 -0.100574  2.733322
4  0.052725 -0.164856  2.733322
5 -1.201619  1.578153  2.733322
6  1.921872  0.505875  2.733322

更新:从Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers开始。

答案 1 :(得分:0)

语法无效,因为您使用的是三元条件,但只使用了上半部分。

三元条件允许您编写if语句,如下所示:

a = 1 if b > 0 else 0

在你的情况下,你可以这样写:

df = (
  df
  .assign(c = lambda x: x.num_col.sum() if x.num_col > 0 else 0)
)

请注意最后添加else 0