如何根据标签名称获取数据帧不同间隔的中位数?

时间:2019-10-17 15:03:17

标签: python-3.x pandas

因此,我有一个包含两列的DataFrame,一列具有标签名称(df ['Labels']),另一列具有int值(df ['Volume'])。

df = pd.DataFrame({'Labels': 
['A','A','A','A','B','B','B','B','B','B','A','A','A','A','A','A','A','A','C','C','C','C','C'],
                   'Volume':[10,40,20,20,50,60,40,50,50,60,10,10,10,10,20,20,10,20,80,90,90,80,100]})

我想确定标签更改的间隔,然后针对每个间隔计算“体积”列的中位数。稍后,我应将“音量”列的每个值替换为每个间隔的相应中位数。

对于标签A,我希望获得两个间隔的中位数。

这是我的DataFrame的外观:

df2 = pd.DataFrame({'Labels':['A','A','A','A','B','B','B','B','B','B','A','A','A','A','A','A','A','A','C','C','C','C','C'],
                    'Volume':[20,20,20,20,50,50,50,50,50,50,10,10,10,10,10,10,10,10,90,90,90,90,90]})

2 个答案:

答案 0 :(得分:1)

您要groupby块并转换中位数:

blocks = df['Labels'].ne(df['Labels'].shift()).cumsum()
df['group_median'] = df['Volume'].groupby(blocks).transform('median')

答案 1 :(得分:1)

使用Series.cumsum + Series.shift()使用groupby创建组,然后使用transform

df['Volume']=df.groupby(df['Labels'].ne(df['Labels'].shift()).cumsum())['Volume'].transform('median')
print(df)

   Labels  Volume
0       A      20
1       A      20
2       A      20
3       A      20
4       B      50
5       B      50
6       B      50
7       B      50
8       B      50
9       B      50
10      A      10
11      A      10
12      A      10
13      A      10
14      A      10
15      A      10
16      A      10
17      A      10
18      C      90
19      C      90
20      C      90
21      C      90
22      C      90