替换pandas df中的引号来计算唯一的术语

时间:2014-08-17 12:31:24

标签: python numpy pandas

我正在使用pandas阅读一个excel文件,其中包含每个"公司"柱:

'B Of A M L, Dougherty & Co., Goldman Sachs, Raymond James'
'Zacks Small Cap'
'Wedbush Securit'
'B Of A M L, Cowen & Company, Deutsche Bk Sec, Fbr Cap Markets, J.P. Morgan'
'Janney Mont., Jefferies & Co., Leerink Partner'

我的df看起来像这样:

    firms
0   NaN
1   NaN
2   NaN
3   Benchmark Compa, Brean Capital, Noble Financia...
4   Fig Partners
5   Raymond James
6   Keefe Bruyette
7   Fbr Cap Markets, Fig Partners, Keefe Bruyette,...
8   Stifel Nicolaus, William Blair
9   NaN

我正在尝试获取一个唯一的公司列表并传递给python列表,所以我执行以下操作:

unique_firms = df.firms.unique()

然而,在执行此操作之后以及转换为python列表以检查数组的内容

之后
unique_firms.tolist()

我得到(部分输出):

[nan,
 u'Benchmark Compa, Brean Capital, Noble Financial, Northcoast Rese',
 u'Fig Partners',
 u'Raymond James',
 u'Keefe Bruyette',
 u'Fbr Cap Markets, Fig Partners, Keefe Bruyette, Raymond James',
 u'Stifel Nicolaus, William Blair',
 u'Macquarie Capit, Morgan Stanley, William Blair',
 u'Barclays Capita, Craig-Hallum, Deutsche Bk Sec, William Blair',
 u'Co Forecst, Gabelli & Compa, Keybanc Cap Mkt, Northcoast Rese',
 u'Co Forecst',
 u'Ascendiant Cap, Zacks Small Cap',
 u'B Of A M L, Feltl & Company, Piper Jaffray, Raymond James, Stifel Nicolaus',
 u'B Of A M L, Benchmark Compa, Jefferies & Co., Morgan Stanley, Piper Jaffray, Raymond James, William Blair',
 u'Baird R W, Global Hunter S, Ladenberg Thalm, Stifel Nicolaus, Suntrust Robins, Wunderlich Res',

Bo of A M L和其他人重复,所以我的代码不是选择独特的术语。有没有办法创建一个新的pandas或numpy数组,其中包含以字符串逗号分隔的唯一术语?

2 个答案:

答案 0 :(得分:2)

通过查看你的例子,我看到你有一堆NaN,你需要先处理它:

df = df.dropna()

这是非常重要的一步,在之前提出的解决方案中省略了。下一步是其他用户的建议:

df2 = pd.DataFrame(df.firms.str.split(',').tolist())
firms = df2.stack().unique().tolist()

这应该会产生一系列公司,这就是其他解释停止的地方。如果仔细检查,字符串的开头会有一些尾随空格,所以:

' Dougherty & Co.',  

将被视为单独的实体:

'Dougherty & Co.',  

下一步是创建独特公司列表的必要步骤,这也是我认为其他解决方案无效的另一个原因:

clean_list = []
for firm in firms:
    firm = firm.strip()
    if firm not in clean_list:
        clean_list.append(firm)
    clean_list.sort()

clean_list
['B Of A M L',
 'Cowen & Company',
 'Deutsche Bk Sec',
 'Dougherty & Co.',
 'Fbr Cap Markets',
 'Goldman Sachs',
 'J.P. Morgan',
 'Janney Mont.',
 'Jefferies & Co.',
 'Leerink Partner',
 'Raymond James',
 'Wedbush Securit',
 'Zacks Small Cap']

答案 1 :(得分:1)

我从

开始
In[141]: df
Out[141]: 
                                               firms
0  B Of A M L, Dougherty & Co., Goldman Sachs, Ra...
1                                    Zacks Small Cap
2                                    Wedbush Securit
3  B Of A M L, Cowen & Company, Deutsche Bk Sec, ...

我现在正在为两个问题做几乎相同的练习,这很有趣。此外,您的数据结构混乱了,因为您在同一列中有单独的条目(用逗号分隔)。我们首先解决这个问题:

In[144]: df2 = pd.DataFrame(df.firms.str.split(',').tolist())
In[145]: df2
Out[145]: 
                 0                 1                 2                 3  \
0       B Of A M L   Dougherty & Co.     Goldman Sachs     Raymond James   
1  Zacks Small Cap              None              None              None   
2  Wedbush Securit              None              None              None   
3       B Of A M L   Cowen & Company   Deutsche Bk Sec   Fbr Cap Markets   
4     Janney Mont.   Jefferies & Co.   Leerink Partner              None   

              4  
0          None  
1          None  
2          None  
3   J.P. Morgan  
4          None 

现在我们可以简单地做

In[148]: df2.stack().unique().tolist()
Out[148]: 
['B Of A M L',
 ' Dougherty & Co.',
 ' Goldman Sachs',
 ' Raymond James',
 'Zacks Small Cap',
 'Wedbush Securit',
 ' Cowen & Company',
 ' Deutsche Bk Sec',
 ' Fbr Cap Markets',
 ' J.P. Morgan',
 'Janney Mont.',
 ' Jefferies & Co.',
 ' Leerink Partner']