2016-03-04 60 views
0

我對Python很陌生,我試圖使用Pandas(在iPython Notebook,Python 3中)來組合三列。這是原始數據:使用for循環連接Pandas中的列

 RegistrationID FirstName MiddleInitial LastName  
      1    John  P    Smith  
      2    Bill  Missing  Jones 
      3    Paul  H    Henry 

我想有:

RegistrationID FirstName MiddleInitial LastName FullName 
    1    John  P    Smith Smith, John, P 
    2    Bill  Missing  Jones Jones, Bill 
    3    Paul  H    Henry Henry, Paul, H 

我敢肯定,這絕對不是這樣做的正確的方式,但是這是我如何在for循環中設置它。不幸的是,它只是繼續前進,永遠不會結束。

%matplotlib inline 
import pandas as pd 

from IPython.core.display import HTML 
css = open('style-table.css').read() + open('style-notebook.css').read() 
HTML('<style>{}</style>'.format(css)) 

reg = pd.DataFrame.from_csv('regcontact.csv', index_col=RegistrationID) 

for item, frame in regcombo['MiddleInitial'].iteritems(): 
while frame == 'Missing': 
    reg['FullName'] = reg.LastName.map(str) + ", " + reg.FirstName 
else: break 

的想法是再添加另一列對於那些全名(即包括MiddleInitial):

for item, frame in regcombo['MiddleInitial'].iteritems(): 
while frame != 'Missing': 
    reg['FullName1'] = reg.LastName.map(str) + ", " + reg.FirstName + ", " + reg.MiddleInitial 
else: break 

然後將它們組合起來,以便有沒有空值。我到處尋找,但我無法弄清楚。任何幫助將不勝感激,如果我違反了任何約定,我會提前道歉,因爲這是我的第一篇文章。

回答

1

這使用列表理解來創建新的數據幀列,例如, [(a,b,c)for a,b,c in some_iterable_item]。

df['Full Name'] = [ 
    "{0}, {1} {2}" 
    .format(last, first, middle if middle != 'Missing' else "").strip() 
    for last, first, middle 
    in df[['LastName', 'FirstName', 'MiddleInitial']].values] 

>>> df 
    RegistrationID FirstName MiddleInitial LastName  Full Name 
0    1  John    P Smith Smith, John P 
1    2  Bill  Missing Jones Jones, Bill 
2    3  Paul    H Henry Henry, Paul H 

iterable_item是值從數據框數組:

>>> df[['LastName', 'FirstName', 'MiddleInitial']].values 
array([['Smith', 'John', 'P'], 
     ['Jones', 'Bill', 'Missing'], 
     ['Henry', 'Paul', 'H']], dtype=object) 

所以,按照我們的清單理解模型:

>>> [(a, b, c) for (a, b, c) in df[['LastName', 'FirstName', 'MiddleInitial']].values] 
[('Smith', 'John', 'P'), ('Jones', 'Bill', 'Missing'), ('Henry', 'Paul', 'H')] 

我然後格式化字符串:

a = "Smith" 
b = "John" 
c = "P" 
>>> "{0}, {1} {2}".format(a, b, c) 
"Smith, John P" 

我用三元檢查,如果中間名是「失蹤」,所以:

middle if middle != "Missing" else "" 

等同於:

if middle == 'Missing': 
    middle = "" 

最後,我添加.strip()去除的情況下的額外空間中間名缺失。

+0

非常感謝評論「失蹤」的東西 - 沒有注意到在問題中。 –

+0

這很有幫助。謝謝! – Steven

+0

嗨那裏 - 如果我想檢查列中的特定值,然後返回另一列中的預定義字符串(即,而不是數組中的值),這是行不通的,對嗎?在這種情況下,我需要恢復到像我的原始示例一樣的循環? – Steven

1

所有你需要做的就是添加列:

>>> df.FirstName + ', ' + df.LastName + ', ' + df.FullName.str.replace(', Missing', '') 
0   John, Smith, P 
1 Bill, Jones, Missing 
2   Paul, Henry, H 
dtype: object 

要添加新列,你可以這樣寫:

df['FullName'] = df.FirstName + ', ' + ... 

(在熊貓,它通常試圖避免環路等)。

+0

一旦您添加邏輯從中間名中刪除'Missing',時間利益就會變得微不足道。你需要類似'df.FullName.str.replace(',Missing',「」)' – Alexander

+0

謝謝,@亞歷山大 - 沒有注意到有關'Missing'的部分。不勝感激! –