2017-09-15 2 views
1

Je suis sûr qu'il doit y avoir un correctif pour cela, mais je ne trouve pas de réponse avec une bonne explication. Je cherche à itérer sur un dataframe et à construire un tableau croisé pour chaque paire de colonnes avec des pandas. J'ai sous-échantillonné 2 cols à partir des données d'origine et supprimé les lignes avec des données inappropriées. Avec les données restantes, je cherche à faire un tableau croisé pour finalement construire un tableau de contingence pour faire un test ChiX. Voici mon code:ValueError lors de l'utilisation du tableau croisé des pandas

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 

La trame de données contient les valeurs 0.0, 0.5, 1.0. Le '0.5' étant des données manquantes, j'enlève ces lignes avant de créer le tableau de contingence, les valeurs restantes dont je souhaite que les tables de contingence proviennent sont toutes 0.0 ou 1.0. J'ai vérifié au code travaille jusqu'à ce point. L'erreur imprimée à la console est:

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

Si quelqu'un peut expliquer pourquoi cela ne fonctionne pas? Aider à résoudre de quelque manière que ce soit? Ou encore mieux de fournir une alternative pour faire un test ChiX sur les colonnes alors ce serait très utile, merci d'avance!

EDIT: exemple de la structure des premières rangées de 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

Bien sûr, il existe une solution rapide. Pourquoi ne pas nous montrer vos données? –

+0

C'est fondamentalement un dataframe avec 2 colonnes et environ 100 lignes et toutes les valeurs sont 1 ou 0. La dataframe originale 'my_data' est d'où provient sample_df et son similaire sauf avec ~ 3000 colonnes et a des lignes supplémentaires avec la valeur ' 0,5 ', qui ont été supprimés dans sample_df – user3062260

+0

Qu'est-ce qu'un échantillon? –

Répondre

1

Un tableau croisé entre deux entités identiques n'a pas de sens. pandas va vous dire:

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

Ce qui signifie qu'il suppose que vous passer deux différentes colonnes d'une trame de données multi-indexé avec le même nom.

Dans votre code, vous itérez sur des colonnes dans une boucle imbriquée, donc la situation se produit où c1 == c2, donc pd.crosstab des erreurs.


Le correctif impliquerait l'ajout d'un contrôle if et sauter cette itération si les colonnes sont égales. Donc, vous feriez:

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

     ... # rest of your code