2016-10-10 77 views
1

我知道分配可能有助於基於lambda函數這樣創建/修改一個列:[熊貓]分配一個新列的方式基於if語句

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

但我不能找到一種方法如果我想使語句內聯而不是在操作之外單獨執行,可以使用if語句執行此操作。

是否有可能實現這一點沒有做別的操作以外:

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

上面的命令返回「的SyntaxError:無效的語法」

回答

2

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 

UPDATE:從熊貓0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers開始。

+0

謝謝但df已經涉及了一些操作,這將不得不分開操作。 –

+0

@京珠雲,我沒有明白 - 你是什麼意思?你需要一個新的__virtual__列(使用'assign'方法)還是一個__permanent__嗎? – MaxU

+0

是一個虛擬的,因爲我想在分配諸如df.ix []。rename()... assign()之前進行很多df操作。因此,df不是應用賦值函數的原始df。 –

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的末。

+0

您是否嘗試運行此代碼?我不認爲它會真正起作用。 – shawnheide

+0

感謝邁克爾分享這一點的知識。但它不會與錯誤一起工作:ValueError:一個Series的真值是不明確的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。 –