2017-09-15 11 views
1

クイックフィックスが必要であると確信していますが、説明がわかりません。私は、データフレーム上で反復処理を行い、パンダを持つ各列のペアのクロス集計を作成したいと考えています。私は元のデータから2つの列をサブセット化し、不適切なデータで行を削除しました。残りのデータを使用して、私はChiXテストを行うための不測の表を最終的に作成するためにクロス集計を行うことを検討しています。私のコードは以下の通りです:パンダのクロス集計を使用した場合のValueError

my_data = pd.read_csv(DATA_MATRIX, index_col=0) #GET DATA 
AM = pd.DataFrame(columns=my_data.columns, index = my_data.columns) #INITIATE DF TO HOLD ChiX-result 

for c1 in my_data.columns: 
    for c2 in my_data.columns: 
     sample_df = pd.DataFrame(my_data, columns=[c1,c2]) #make df to do ChiX on 
     sample_df = sample_df[(sample_df[c1] != 0.5) | (sample_df[c2] != 0.5)].dropna() # remove unsuitable rows 

     contingency = pd.crosstab(sample_df[c1], sample_df[c2]) ##This doesn't work? 

     # DO ChiX AND STORE P-VALUE IN 'AM': CODE STILL TO WRITE 

データフレームの値は0.0、0.5、1.0です。 '0.5'にはデータがありませんので、コンティンジェンシーテーブルを作成する前にこれらの行を削除します。残りの値は、コンティンジェンシーテーブルを作成する際には0.0または1.0です。私はこの時点までのコード作業を確認しました。コンソールに表示されるエラーは次のとおりです。

ValueError: If using all scalar values, you must pass an index 

これはなぜ機能しないのですか?どのような方法で解決するのを助ける?それとも、列のChiXテストを行う代わりの方法を提供してください。それは事前に感謝しています。

EDIT:sample_df

  col1 col2 
    sample1 1 1 
    sample2 1 1 
    sample3 0 0 
    sample4 0 0 
    sample5 0 0 
    sample6 0 0 
    sample7 0 0 
    sample8 0 0 
    sample9 0 0 
    sample10 0 0 
    sample11 0 0 
    sample12 1 1 
+0

もちろん、クイックフィックスがあります。あなたのデータを私たちに見せてもらえますか? –

+0

基本的には、2列100行程度のデータフレームで、値はすべて1または0です。元のデータフレーム 'my_data'は、sample_dfが派生したもので、〜3000の列を除いて類似しています。 0.5 '、sample_dfで削除されました – user3062260

+0

サンプルとは何ですか? –

答えて

1

の最初の数行の構造の一例は、2つの同一のエンティティ間のクロス集計は無意味です。 pandasはあなたを伝えるために起こっている:

ValueError: The name col1 occurs multiple times, use a level number 

それはあなたが同じ名前を持つマルチインデックス付きデータフレームから2つの異なる列を渡していると仮定し意味します。

あなたのコードでは、ネストされたループの列を反復しているので、c1 == c2のような状況が発生し、pd.crosstabがエラーになります。


修正がifチェックを追加すると列が等しい場合はその反復をスキップ伴うだろう。だから、あなたはそうするでしょう:

for c1 in my_data.columns: 
    for c2 in my_data.columns: 
     if c1 == c2: 
      continue 

     ... # rest of your code 
関連する問題