2017-10-09 11 views
0

J'ai un dataframe de pandas géants de fruits ::cas sensible série correspondant Pandas et propre série Panda Logic

df = pd.read_csv(newfile, header=None) 
df 
      0  1  2    3  4  5 6 7 
0  Apple Bananas  Fig Elderberry Cherry Honeydew NaN NaN 
1  Bananas Cherry Dragon Elderberry  NaN   NaN NaN NaN 
2  Cherry Grape  NaN   NaN  NaN   NaN NaN NaN 
3  Dragon  NaN Apple  Bananas Cherry Elderberry NaN NaN 
4 Elderberry Apple Bananas   Fig Grape   NaN NaN NaN 
5   Fig Cherry Honeydew   Apple  NaN   NaN NaN NaN 
6  Grape  NaN  NaN   NaN  NaN   NaN NaN NaN 
7  Honeydew Grape  Fig  Elderberry Dragon  Cherry Bananas Apple  

Et je suis en train de trouver des « appariements de fruits », par exemple dans la première rangée, Apple et Fig sont une paire, et 6ème rangée Fig et Apple. De même pour Apple-Elderberry et Elderberry-Apple, mais pas Apple et les bananes (il n'y a pas de pommes dans la rangée à partir de bananes).

J'ai le travail de code suivant, et qui fait cela ::

fruits = df[0] 
stock = df.drop(0, axis=1) 

for i in range(len(fruits)): 
    string1 = str(fruits[i]) 
    full_line = (stock.iloc[i]) 
    line = np.array(full_line.dropna(axis=0)) 
    if len(line) > 0 : 
     for j in range(len(stock)): 
      iind = (fruits[fruits == line[j]].index[0]) 
      this_line = stock.iloc[iind] 
      logic_out = this_line.str.match(string1) 
      print(logic_out) 

MAIS !! (1) Il casse au niveau des fruits == ligne [j] car la série Pandas est sensible à la casse et (2) la sortie booléenne est un mélange de Vrai, Faux et NaN. Idéalement, je veux juste compter les Trues. Toute aide est très appréciée !!

Répondre

1

Je vais utiliser la logique ensemble, Pandas d'empilage et numpy diffusion

f = lambda x: x.title() if isinstance(x, str) else x 

s = df.applymap(f).set_index('0').rename_axis(None).stack().groupby(level=0).apply(set) 

f = s.index 
p = s.values 

one_way = (p[:, None] & [{x} for x in f]).astype(bool) 
[(f[i], f[j]) for i, j in zip(*np.where(one_way & one_way.T))] 

[('Apple', 'Elderberry'), 
('Apple', 'Fig'), 
('Apple', 'Honeydew'), 
('Bananas', 'Dragon'), 
('Bananas', 'Elderberry'), 
('Dragon', 'Bananas'), 
('Elderberry', 'Apple'), 
('Elderberry', 'Bananas'), 
('Fig', 'Apple'), 
('Fig', 'Honeydew'), 
('Honeydew', 'Apple'), 
('Honeydew', 'Fig')] 
+0

Salut @piRSquared, cela ressemble beaucoup, mais se bloque sur la première ligne, avec un KeyError: message « 0 ». ... J'ai édité le code ci-dessus pour vous montrer comment je lis dans la df et le .cvs est ci-dessous. – npross

+0

Pomme, Bananes, Figue, Sureau, Cerise, Honeydew ,, Bananes, Cerise, Dragon, Baie de Sureau ,,,, Cerise, Raisin ,,,,,, Dragon ,, Pomme, Bananes, Cerise, Sureau, Sureau, Pomme, Bananes, Figue, Raisin ,,, Figue, Cerise, Honeydew, Apple ,,,, Raisin ,,,,,,, Honeydew, Raisin, Figue, Sureau, Dragon, Cerise, Banane, Pomme – npross

+0

Quel est le nom de la première colonne? Je suppose que c'était '' 0 '' parce que c'est ce qui est analysé quand je copie et passe la base de données que vous avez fournie. Essayez ma mise à jour dans une seconde. – piRSquared