| 1st Most Common Value | 2nd Most Common Value | 3rd Most Common Value | 4th Most Common Value | 5th Most Common Value |
|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|
| Grocery Store         | Pub                   | Coffee Shop           | Clothing Store        | Park                  |
| Pub                   | Grocery Store         | Clothing Store        | Park                  | Coffee Shop           |
| Hotel                 | Theatre               | Bookstore             | Plaza                 | Park                  |
| Supermarket           | Coffee Shop           | Pub                   | Park                  | Cafe                  |
| Pub                   | Supermarket           | Coffee Shop           | Cafe                  | Park                  |

Le nom de la trame de données est df0. Comme vous pouvez le voir, de nombreuses valeurs se répètent dans toutes les colonnes. Je veux donc créer un dataframe qui a toutes les valeurs uniques avec leurs fréquences de toutes les colonnes. Quelqu'un peut-il s'il vous plaît aider avec le code puisque je veux en créer un diagramme à barres?

La sortie doit être la suivante:

| Venues         | Count |
|----------------|-------|
| Bookstore      | 1     |
| Cafe           | 2     |
| Coffee Shop    | 4     |
| Clothing Store | 2     |
| Grocery Store  | 2     |
| Hotel          | 1     |
| Park           | 5     |
| Plaza          | 1     |
| Pub            | 4     |
| Supermarket    | 2     |
| Theatre        | 1     |
1
Chirag Sable 3 juin 2020 à 00:13

3 réponses

Meilleure réponse

EDIT : j'ai pris de l'avance sur moi-même dans ma réponse originale (merci également OP pour l'ajout de l'édition / sortie attendue). Vous voulez ce post, je pense que la réponse la plus simple:

new_df = pd.DataFrame(df0.stack().value_counts())

Si vous ne vous souciez pas de la colonne d'où proviennent les valeurs et que vous voulez simplement leur décompte, utilisez value_counts() (comme @Celius Stingher l'a dit dans les commentaires), en suivant ce message.

Si vous souhaitez signaler la fréquence de chaque valeur pour chaque colonne, vous pouvez utiliser value_counts() pour chaque colonne, mais vous risquez de vous retrouver avec des entrées inégales (pour revenir à un DataFrame, vous pouvez faire une sorte de join).

J'ai plutôt créé une petite fonction pour compter les occurrences de valeurs dans un df, et en renvoyer une nouvelle:

import pandas as pd
import numpy as np

def counted_entries(df, array):
    output = pd.DataFrame(columns=df.columns, index=array)
    for i in array:
        output.loc[i] = (df==i).sum()
    return output

Cela fonctionne pour un df rempli de noms d'animaux aléatoires. Il vous suffit de passer les entrées uniques dans le df en récupérant le set de ses valeurs:

columns = ['Column ' + str(i+1) for i in range(10)]
index = ['Row ' + str(i+1) for i in range(5)]

df = pd.DataFrame(np.random.choice(['pig','cow','sheep','horse','dog'],size=(5,10)), columns=columns, index=index)

unique_vals = list(set(df.stack())) #this is all the possible entries in the df

df2 = counted_entries(df, unique_vals)

df avant:

      Column 1 Column 2 Column 3 Column 4  ... Column 7 Column 8 Column 9 Column 10
Row 1      pig      pig      cow      cow  ...      cow      pig      dog       pig
Row 2    sheep      cow      pig    sheep  ...      dog      pig      pig       cow
Row 3      cow      cow      cow    sheep  ...    horse      dog    sheep     sheep
Row 4    sheep      cow    sheep      cow  ...      cow    horse      pig       pig
Row 5      dog      pig    sheep    sheep  ...    sheep    sheep    horse     horse

Sortie de counted_entries()

       Column 1  Column 2  Column 3  ...  Column 8  Column 9  Column 10
pig           1         2         1  ...         2         2          2
horse         0         0         0  ...         1         1          1
sheep         2         0         2  ...         1         1          1
dog           1         0         0  ...         1         1          0
cow           1         3         2  ...         0         0          1
3
Tom 3 juin 2020 à 14:35

Vous pouvez également faire ceci:

df = pd.read_csv('test.csv', sep=',')
list_of_list = df.values.tolist()
t_list = sum(list_of_list, [])
df = pd.DataFrame(t_list)
df.columns = ['Columns']
df = df.groupby(by=['Columns'], as_index=False).size().to_frame().reset_index().rename(columns={0: 'Count'})
print(df)

           Columns  Count
0        Bookstore      1
1             Cafe      2
2   Clothing Store      2
3      Coffee Shop      4
4    Grocery Store      2
5            Hotel      1
6             Park      5
7            Plaza      1
8              Pub      4
9      Supermarket      2
10         Theatre      1
1
NYC Coder 3 juin 2020 à 12:29

Merci pour la modification, c'est peut-être ce que vous recherchez, en utilisant value_counts pour la trame de données complète, puis en agrégeant la sortie:

df0 = pd.DataFrame({'1st':['Grocery','Pub','Hotel','Supermarket','Pub'],
                    '2nd':['Pub','Grocery','Theatre','Coffee','Supermarket'],
                    '3rd':['Coffee','Clothing','Supermarket','Pub','Coffee'],
                    '4th':['Clothing','Park','Plaza','Park','Cafe'],
                    '5th':['Park','Coffee','Park','Cafe','Park']})

df1 = df0.apply(pd.Series.value_counts)
df1['Count'] = df1.sum(axis=1)
df1 = df1.reset_index().rename(columns={'index':'Venues'}).drop(columns=list(df0))
print(df1)

Production:

        Venues  Count
5         Park    5.0
2       Coffee    4.0
7          Pub    4.0
8  Supermarket    3.0
0         Cafe    2.0
1     Clothing    2.0
3      Grocery    2.0
4        Hotel    1.0
6        Plaza    1.0
9      Theatre    1.0
1
Celius Stingher 3 juin 2020 à 11:39