根据一列中重复的值序列将pandas数据帧分组

时间:2017-07-27 16:49:12

标签: python pandas dataframe data-analysis

我的数据框中有两列:x和y。 x在1-4之间不断重复,我需要找出关于x = 2的部分的一些统计数据,例如中点和平均等我使用.shift(-1)创建了第三列:

 df['x_shift']=df['x'].shift(-1)

x  y   x_shift 
1  25  1
1  25  1
1  25  2
2  25  2
2  45  2
2  90  3
3  90  3
3  90  3
3  90  4
4  60  4
4  40  1 
1  25  1
1  25  1
1  25  2
2  43  2
2  66  2
2  77  2
2  90  3
3  90  

使用这个,我已经确定了x从1变为2和从2变为3的点,以标记我需要数据的起点和终点:

   start point =     df.ix[(df['x']==2) & (df['x_shift']==2)] 
   final point = df.ix[df['x']==2) & (df['x_shift']==3)]

我尝试创建组来生成统计信息,但我不确定如何在groupby中包含上述内容:

 grouped = df.groupby(     )

目的是使用grouped.describe()生成统计数据,我希望我能够提取和绘制数据?

2 个答案:

答案 0 :(得分:0)

我不熟悉熊猫,但拆分数据应该不会太困难。它看起来不像人物经常重复。为了拆分它们,我将迭代数据,并将当前数据点与之前的数据点进行比较。假设它总是从4变为1,潜在的代码将如下所示:

for a in range(1,len(x)):
    if x[a] == 1 and x[a-1] == 4:
        ##Separate data depending on the format you want it in

至于找到中点和渐变,我猜这些是Panda特有的,但你可以通过for循环和if语句识别x列中的数据等于2的情况:

for b in x:
    if b == 2:
        ##Return midpoint, gradient in column y

答案 1 :(得分:0)

选项1
x == 2

的快速方法
df.query('x == 2').y.describe()

count     7.000000
mean     62.285714
std      25.256777
min      25.000000
25%      44.000000
50%      66.000000
75%      83.500000
max      90.000000
Name: y, dtype: float64

选项2
更完整

df.groupby('x').y.describe()

   count       mean        std   min   25%   50%   75%   max
x                                                           
1    6.0  25.000000   0.000000  25.0  25.0  25.0  25.0  25.0
2    7.0  62.285714  25.256777  25.0  44.0  66.0  83.5  90.0
3    4.0  90.000000   0.000000  90.0  90.0  90.0  90.0  90.0
4    2.0  50.000000  14.142136  40.0  45.0  50.0  55.0  60.0

选项3
更具体的

df.groupby('x').y.agg(['mean', 'median', 'max', 'min', 'count', 'size'])

        mean  median  max  min  count  size
x                                          
1  25.000000      25   25   25      6     6
2  62.285714      66   90   25      7     7
3  90.000000      90   90   90      4     4
4  50.000000      50   60   40      2     2

选项4
分成不同的连续组

df.groupby(
    ['x', df.x.ne(df.x.shift()).cumsum().rename('grp')]
).y.describe().loc[2]

     count       mean        std   min    25%   50%    75%   max
grp                                                             
2      3.0  53.333333  33.291641  25.0  35.00  45.0  67.50  90.0
6      4.0  69.000000  19.916492  43.0  60.25  71.5  80.25  90.0

或者

df.groupby(
    ['x', df.x.ne(df.x.shift()).cumsum().rename('grp')]
).y.agg(['mean', 'median', 'max', 'min', 'count', 'size']).loc[2]

          mean  median  max  min  count  size
grp                                          
2    53.333333    45.0   90   25      3     3
6    69.000000    71.5   90   43      4     4