2017-09-15 88 views
1

我敢肯定,必須有一個quickfix,但我找不到一個好的解釋答案。我正在尋找迭代一個數據框,併爲每一對帶熊貓的列構建一個交叉表。我已經從原始數據中對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測試,然後這會非常有幫助,事先要感謝!

編輯:例如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

的前幾行的結構的兩個相同的實體之間的一個交叉表是無意義的。 pandas會告訴你:

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

這意味着它假定你傳遞了兩個不同列從多索引數據框使用相同的名稱。

在你的代碼中,你正在遍歷嵌套循環中的列,所以出現這種情況的地方出現了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