2017-10-09 4 views
0

私は果物のパンダのデータフレームを持っている::大文字と小文字を区別パンダシリーズマッチングとクリーンパンダシリーズ・ロジック

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  

そして、私は、例えば、「フルーツのペアリング」を見つけようとしています最初の行では、AppleとFigはペア、6行目はAppleとAppleです。 Apple-ElderberryとElderberry-Appleの場合は同様ですが、AppleとBananasはそうではありません(Bananasから始まる行にはApplesがありません)。

私は、次のコードの作業を持って、それがこれを行い::

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) 

しかし! (1)Pandas Seriesは大文字と小文字が区別され、(2)ブール値の出力はTrue、Falses、NaNが混在しているため、果物== line [j]で壊れます。理想的には、私はTruesを数えたいだけです。すべてのヘルプv。多くの感謝!

答えて

1

私は、設定ロジックを使用するつもりだパンダはスタッキング、および

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

こんにちは@piRSquaredを放送numpyの、これは偉大に見えるが、KeyError例外を持つ最初の行にクラッシュした:「0」のメッセージ。 ...上記のコードを編集して、私がdfでどのように読んでいるのか、そして.cvsは以下の通りです。 – npross

+0

アップル、バナナ、図、エルダーベリー、チェリー、ハニーデュー,, バナナ、チェリー、ドラゴン、エルダーベリー,,,, チェリー、ブドウ,,,,,, ドラゴン,,アップル,,バナナ、チェリー、エルダーベリー、 Elderberry、Apple、Bananas、Fig、Grape ,,, Figue、Cherry、Honeydew、Apple ,,,, グレープ,,,,,,, 蜜柑、ブドウ、イチゴ、ドラゴン、チェリー、バナナ、アップル – npross

+0

最初の列の実際の名前は何ですか。私はそれがあなたが提供したデータフレームをコピーして通過するときに解析されるため、それが '' 0 ''であると仮定します。私のアップデートをもう一度試してみてください。 – piRSquared

関連する問題