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.
4 Réponses :
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
Merci @Chinmay veuillez accepter cette réponse ou une autre comme solution si cela vous a aidé à résoudre.
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.
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
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)
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.
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!