2017-07-18 83 views
1

我是熊貓和Numpy的新手。我有一個數據框,我希望通過對列的每一行應用一個函數來創建一個新列。我們來看一個簡化的例子:如果第一個功能失敗,請使用第二個功能

import pandas as pd 
import numpy as np 

df = pd.DataFrame(columns=["names"], data=["Brussels", 2, "New York"]) 

def to_lower(value): 
    try: 
     return value.lower() 
    except AttributeError: 
     return None 

def to_string(value): 
    return str(value) 

df['lower_names'] = np.vectorize(to_lower)(df['names']) 

該操作工作得很好。現在我想將to_string()to_lower()僅應用於結果爲None的「lower_names」的行(我不知道這是否非常清楚)。

這看起來很基本,但我有麻煩。我可以詳細描述我的嘗試,但是我害怕出現一個白癡......也許我應該在一週或兩週之前學習這兩個模塊,但在此之前,任何建議都會受到歡迎。

編輯:@jezrael解決方案是正確的......對於我的簡化示例。現在讓我們想象一下,我想僅在列名「行」的行中應用np.vectorize(to_string)函數,然後np.vectorize(to_lower),其中第一個結果爲None,那麼執行該操作的最佳方式是什麼?

回答

2

我認爲你需要改變return Nonereturn to_string(value)

def to_lower(value): 
    try: 
     return value.lower() 
    except AttributeError: 
     return to_string(value) 

def to_string(value): 
    return str(value) 

df['lower_names'] = np.vectorize(to_lower)(df['names']) 


print (df['lower_names'].apply(type)) 
0 <class 'str'> 
1 <class 'str'> 
2 <class 'str'> 
Name: lower_names, dtype: object 

也有可能使用astype的轉換和所有值str然後str.lower

df['lower_names'] = df['names'].astype(str).str.lower() 
+0

謝謝@jezrael,這是部分我的嘗試。它在我簡化的例子中運行得非常好,但不在我的實際數據中,我不知道爲什麼......同時,簡化問題並將其發佈在SO上,可以幫助我清楚地瞭解自己的反思。 –

+1

@EttoreRizza - 我相信如此。嘗試一些調試或嘗試解釋更多什麼是問題。 – jezrael

+0

你是對的,當然,我通過簡化它提出了一個錯誤的問題。我會編輯它,如果沒有其他人更準確地回答我錯誤定義的問題,請接受您的回答。 –