2017-04-13 52 views
1

我有一個任務是根據用於創建所述DataFrame的文件在我的DataFrame中創建一個列。我可以用下面的代碼來解決這個問題,但我認爲有更好的方法。我敢肯定,我可以跳過創建列並將其設置爲零的步驟:dfp['F'] = 0,並可能使功能更清潔。使用函數優化設置Pandas列

你會如何優化此代碼?:

import pandas as pd 
import numpy as np 
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
        'C' : ['AA1233445','A9875', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 
print(dfp) 

file2 = r'desktop\somefolder\foo.txt' 
def filename(): 
    if 'foo' in file2.lower(): 
     return 'foo' 
    elif 'bar' in file2.lower(): 
     return 'bar' 

dfp['F'] = 0 
dfp['F'] = dfp['F'] = filename() 

print(dfp) 

PS:我通常pd.read_excel()的功能,因此使用的文件名讀取數據幀。同樣使用熊貓版本0.19.2

+0

這可能是更適合StackExchange的代碼審查的社區。 –

回答

2

對每一行都這樣做是沒有必要的。你可以做一次,並將其填入整個專欄。

使用re模塊

import re 


fnames = re.findall('(foo|bar)', file2) 
fname = fnames[0] if fnames else None 

dfp['F'] = fname 

dfp 

    A B   C   D   E F 
0 NaN 1.0 AA1233445  123456.0  Assign foo 
1 NaN 0.0  A9875  123456.0 Unassign foo 
2 3.0 3.0  rmacy 1234567.0  Assign foo 
3 4.0 5.0 Idaho Rx 12345678.0  Ugly foo 
4 5.0 0.0 Ab123455  12345.0 Appreciate foo 
5 5.0 0.0 TV192837  12345.0  Undo foo 
6 3.0 NaN   RX 12345678.0  Assign foo 
7 1.0 9.0 Ohio Drugs 123456789.0 Unicycle foo 
8 5.0 0.0  RX12345 1234567.0  Assign foo 
9 NaN 0.0 USA Pharma   NaN  Unicorn foo 
+0

非常非常接近我所需要的!謝謝。在'fname'中是否有辦法將'foo'改成別的東西?假設'foo'在file2中,但是我想讓我的熊貓專欄說'程序X'? – MattR

+0

使用字典來映射它。 'fmap = dict(foo ='Program X')'然後'dfp ['F'] = fmap [fname]' – piRSquared

0

我也許忽略了一點,但這裏是你可以指定文件名柱:

import pandas as pd 
import numpy as np 
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
        'C' : ['AA1233445','A9875', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 
file2 = r'desktop\somefolder\foo.txt' 
filename = file2.split('\\')[-1].split('.')[0] 
dfp['F'] = filename 
print(dfp) 
+0

好點的代碼,但不是我所需要的。 – MattR