Czytam plik Excel za pomocą Pandina, który zawiera takie elementy w kolumnie "Firmy":

'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'

Mój plik df wygląda następująco:

    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

Próbuję uzyskać unikalną listę firm i przejść do listy Python, więc wykonuję następujące czynności:

unique_firms = df.firms.unique()

Jednak po tym, jak i po przekształceniu do listy Python, aby sprawdzić zawartość tablicy

unique_firms.tolist()

Dostaję (częściowe wyjście):

[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 o M L i inne są powtarzane, więc mój kod nie wybiera unikalnych terminów. Czy istnieje sposób tworzenia nowej tablicy pandy lub numpy, która zawiera unikalne terminy, które są przecinkami rozdzieloną w łańcuchu?

0
Luis Miguel 17 sierpień 2014, 16:31

2 odpowiedzi

Najlepsza odpowiedź

Patrząc na twój przykład, widzę, że masz grupę Nanu, który musisz sobie z tym poradzić:

df = df.dropna()

Jest to bardzo ważny krok, który został pominięty w poprzednich proponowanych rozwiązaniach. Następnym krokiem jest to, co sugerowali inni użytkownicy:

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

Powinno to wytworzyć listę firm i tam pozostały inne wyjaśnienia. Jeśli sprawdzisz uważnie, na początku ciągu jest kilka spacji, więc:

' Dougherty & Co.',  

Liczyłby się jako oddzielny podmiot z:

'Dougherty & Co.',  

Następny krok jest konieczny, aby stworzyć unikalną listę firm, a to jest inny powód, dla którego uważam, że inne rozwiązania nie działały:

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']
2
Luis Miguel 25 sierpień 2014, 22:56

Zaczynam

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, ...

To bardzo zabawne, że robię prawie tę samą praktykę na dwa pytania już dziś. Również tutaj struktura danych jest pomieszana, ponieważ masz oddzielne wpisy w tej samej kolumnie (oddzielone przecinkami). Najpierw naprawimy to:

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 

Teraz możemy po prostu zrobić

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']
1
FooBar 17 sierpień 2014, 14:52