[英][Pandas]The way to assign a new column based on if statement
我知道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 :無效語法”
IIUC您可以通過以下方式進行操作:
數據:
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
與重命名的列相同:
In [11]: df.iloc[:6].rename(columns={'a':'AAA', 'b':'BBB'}).assign(c=lambda x: x.query('AAA > 0').AAA.sum())
Out[11]:
AAA BBB 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開始, 不建議使用.ix索引器,而建議使用更嚴格的.iloc和.loc索引器 。
語法無效,因為您使用的是三元條件,但僅使用前半部分。
三元條件允許您編寫如下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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.