2017-04-13 41 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