1
votes

Attribuer des valeurs médianes en séparant les données en groupes

J'ai un dataframe que je souhaite séparer en bacs et attribuer à chaque bac la valeur médiane des valeurs de ce bac.

   POA       Egrid           
 (200,300)   Median of (1.17,0.63,1.08)
 (300,400)   Median of (1.22,0.57)

Le résultat devrait ressembler à

   POA   Egrid           
   200   1.17
   205   0.63
   275   1.08
   325   1.22
   350   0.57

J'ai essayé d'écrire deux boucles, mais je n'ai pas réussi à trouver la partie médiane. Toute aide serait bonne.


3 commentaires

Quelle est la logique de création du bac? Une fois que vous avez créé une colonne pour le bac, vous pouvez calculer la médiane en utilisant groupby . Pouvez-vous expliquer la logique derrière bin? Est-ce tous les 100 incréments, comme 100-200, 200-300, 300-400, etc.?


Vous pouvez créer 100 classes d'incrémentation en utilisant ceci. Cela créera de 0 à 1000. Puis groupby et transformation. df ['POA'] = pd.cut (df ['premier'], np.linspace (0, 10000, 101), include_lowest = True) df ['Egrid'] = df.groupby ('POA') ['Egrid']. transform ('median')


Cela fonctionne, merci beaucoup!


4 Réponses :


1
votes

Utilisez: pd.cut et .groupby et .transform

    POA         Egrid
0   [200, 300)  1.080
1   [200, 300)  1.080
2   [200, 300)  1.080
3   [300, 400)  0.895
4   [300, 400)  0.895

EDIT: p>

Il y a un drapeau avec pd.cut qui est right = False . Si nous ajoutons cela, alors les catégories sont beaucoup plus propres et au lieu d'aller à 99, vous pouvez aller à 100.

import pandas as pd
df['POA'] = df['POA'].astype(int)
df['POA'] = pd.cut(df['POA'], [0,100,200, 300,400], include_lowest=True, right=False)
df['Egrid'] = df.groupby('POA')['Egrid'].transform('median')
df = df.drop_duplicates()
df

résultat:

import pandas as pd
df['POA'] = df['POA'].astype(int)
df['POA'] = pd.cut(df['POA'], [0,99,199, 299, 399], include_lowest=True)
df['Egrid'] = df.groupby('POA')['Egrid'].transform('median')
df = df.drop_duplicates()
df


1 commentaires

Merci @Chinmay veuillez accepter cette réponse ou une autre comme solution si cela vous a aidé à résoudre.



0
votes

Ce n'est certainement pas le moyen le plus efficace de le faire, mais cela fonctionnerait!

Tout d'abord, recréons un paramètre similaire:

# first, define a list of possible ranges from which you want the medians
list_of_ranges = [(200, 300), (300, 400)]

# initialize a column named "Median"
df["Median"] = [0]*df.shape[0]

# apply median to the desired ranges
for a, b in list_of_ranges:
    
    # calculate the median from the desired subset of the dataframe
    median = df[(df['POA'] >= a) & (df['POA'] < b)]["Egrid"].median()
    
    # apply the value where the condition is respected
    df.loc[(df['POA'] >= a) & (df['POA'] < b), 'Median'] = median

Ensuite, nous allons ajoutez les médianes:

import numpy as np
import pandas as pd

# make a DataFrame like yours
df = pd.DataFrame([[200, 1.17], [205, 0.63], [275, 1.08], [325, 1.22], [350, 0.57]], columns=["POA", "Egrid"])

Veuillez indiquer si ce n'est pas clair.


0 commentaires

1
votes

Faire avec

s=df.groupby(pd.cut(df.POA,[100,200,300])).Egrid.median().reset_index()
          POA  Egrid
0  (100, 200]  1.170
1  (200, 300]  0.855


0 commentaires

0
votes
import pandas as pd
import numpy as np

# Create the dataframe
d = {'POA':[200,205,275,325,350], 'Egrid':[1.17,0.63,1.08,1.22,0.57]}
df = pd.DataFrame(data=d)

# Create bins to group by
bins = [100,200,300,400,500,600,700,800,900,1000]

# For loop to assign each POA to a bin
for bin in bins:
    upper_bin = bin + 100
    df.loc[(df['POA'] >= bin) & (df['POA'] < upper_bin), 'Bin'] = f'{bin} to {upper_bin}'

# Create a pandas pivot_table to summarize the results
# Displays each bin and its median value
df2 = pd.pivot_table(df, index=['Bin'], values=['Egrid'], aggfunc=np.median)
print(df2)

1 commentaires

Certes, j'aurais dû inclure des commentaires dans mon message. J'ai d'abord créé un dataframe avec les données fournies. Ensuite, j'ai créé une liste de différents bacs que nous aimerions regrouper. J'ai ensuite utilisé une boucle for pour affecter chaque POA à un bac. Enfin, j'ai utilisé un tableau croisé dynamique pandas pour résumer les résultats montrant chaque bin et la valeur médiane.