Python 通过将数据分隔到存储箱来指定中值

Python 通过将数据分隔到存储箱来指定中值,python,pandas,median,Python,Pandas,Median,我有一个数据框,我想把它分成多个存储箱,并为每个存储箱分配该存储箱中的值的中值 POA Egrid 200 1.17 205 0.63 275 1.08 325 1.22 350 0.57 结果应该是这样的 POA Egrid (200,300) Median of (1.17,0.63,1.08) (300,400) Median of (1.22,0.57)

我有一个数据框,我想把它分成多个存储箱,并为每个存储箱分配该存储箱中的值的中值

   POA   Egrid           
   200   1.17
   205   0.63
   275   1.08
   325   1.22
   350   0.57
结果应该是这样的

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

我试着写两个循环,但无法计算中间部分。任何帮助都很好。

使用:
pd.cut
.transform

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
编辑:

有一个带有
pd.cut
的标志,即
right=False
。如果我们加上这个,那么分类就更干净了,你可以选择100,而不是99

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
输出:

    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

这当然不是最有效的方法,但这会奏效的

首先,让我们重新创建一个类似的设置:

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"])
然后,让我们添加中间值:

# 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
#首先,定义一个可能的范围列表,从中选择中位数
范围的列表=[(200,300),(300,400)]
#初始化名为“Median”的列
df[“中值”]=[0]*df.形状[0]
#将中值应用于所需范围
对于_范围列表中的a、b:
#从数据帧的所需子集计算中值
中位数=df[(df['POA']>=a)和(df['POA']=a)和(df['POA']
如果不清楚,请告诉我。

如何处理

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
将熊猫作为pd导入
将numpy作为np导入
#创建数据帧
d={'POA':[200205275325350],'Egrid':[1.17,0.63,1.08,1.22,0.57]}
df=pd.DataFrame(数据=d)
#创建要分组的存储箱
箱子=[1002003004005006007008009001000]
#For循环将每个POA分配给bin
对于垃圾箱中的垃圾箱:
上料仓=料仓+100
df.loc[(df['POA']>=bin)和(df['POA']
创建垃圾箱的逻辑是什么?为bin创建列后,可以使用
groupby
计算中值。你能解释一下bin背后的逻辑吗?是否每100个增量,如100-200、200-300、300-400等?您可以使用此创建100个增量箱。这将从0到1000创建。然后进行分组和变换
df['POA']=pd.cut(df['first'],np.linspace(0,10000,101),include_lower=True)
df['Egrid']=df.groupby('POA')['Egrid'].transform('median')
非常感谢!谢谢@Chinmay如果这个或另一个答案有助于你解决问题,请接受它作为解决方案。当然,我应该在我的帖子中加入评论。首先,我用提供的数据创建了一个dataframe。第二,我创建了一个我们要分组的各种垃圾箱的列表。然后,我使用for循环将每个POA分配给一个bin。最后,我使用一个pandas透视表来总结显示每个bin和中值的结果。
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)