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!