文字だとうまく伝わらないと思うので、図で失礼します。
例は8行ですが実際は100行位で行おうと思っています。
違う列との重複を考えたり、それらを抽出して並び替えたりと自分の身の丈にあっていない作業であることは重々承知なのですがどうしてもやり遂げなければならず、せめて③のスコア表示まででも良いのでたどり着きたいと思っております...!
どなたかご教授よろしくお願い致します・・・!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
質問に挙げている手順をそのまま実装すると良いだけです。
少し補足すると
- 共通要素の抽出は
numpy.intersect1d()
を使うとよい。 - 次に
df[df.isin(共通要素)]
で共通要素以外をNanにする - X,Yの列毎に dropna()した後に順番を振る
- 上記のX,Yの順位データを結合
- df.corr() にて相関係数を計算
となります。
一応サンプルを書いてみましたので参考にしてください。
X,Y共に重複がない前提です。
Python
1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({ 5 'X':['A','1','C','D','2','B','3','4'], 6 'Y':['A','B','5','C','6','7','D','8']}) 7 8# X列とY列の共通要素を抽出 9common_value = np.intersect1d(df.X, df.Y) 10n = common_value.size 11 12# 共通要素以外をNanとする 13df = df[df.isin(common_value)] 14 15# Xの順位データ生成 16x_order = pd.Series(range(1, n+1), index=df.X.dropna(), name='X') 17 18# Yの順位データ生成 19y_order = pd.Series(range(1, n+1), index=df.Y.dropna(), name='Y') 20 21# XとYの順位データを結合 22orders = pd.concat([x_order, y_order], axis=1) 23 24# DataFrame.corr() で算出できる 25print(orders.corr(method='spearman')) 26# X Y 27#X 1.0 0.4 28#Y 0.4 1.0 29 30 31# 一応計算式でも算出してみる 32print(1 - 6 * ((orders.X - orders.Y) ** 2).sum() / ((n**3) - n)) 33# 0.4 34
投稿2018/05/23 02:20
編集2018/05/23 04:16総合スコア15898
0
注:直打ちなのでセルフデバッグしてください。
もとのデータフレームをdf
とします。
x = set(df["X"].values) y = set(df["Y"].values) u = x & y
これでu
の共通要素が取り出されます。
x_ = [v for v in df["X"] if v in u] y_ = [v for v in df["Y"] if v in u]
これが欲しい要素です。
ex_ = {v:i+1 for i,v in enumerate(x_)} ey_ = {v:i+1 for i,v in enumerate(y_)}
番号を対応づけます。
col = sorted(u) ans = pd.DataFrame(columns=col) ox_ = [ex_[k] for k in col] oy_ = [ey_[k] for k in col] ans.iloc[0] = ox_ ans.iloc[1] = oy_ ans = ans.T ans.columns = ['X','Y']
要素を並び替えてDataFrameに入れる。XとYまで。
ans['X-Y'] = ans['X'] - ans['Y'] ans['(X-Y)^2'] = ans['X-Y']* *2 ans = ans.T
スコアまで。
投稿2018/05/22 22:54
総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/23 09:38