2017-07-27 34 views
1

我的数据框中有2列: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( ) 

的意图是使用gr ouped.describe()生成统计数据,我希望我也能够提取和绘图?

+0

我们可以肯定的是,模式是单调? –

+0

我现在正处于一个使用熊猫群功能的阶段,我想在11122223333444411112222333444连续系列中将2222的每个部分分组,然后使用grouped.describe()给出每个部分的统计信息部分2222.有没有人有关于如何将所有这些分开的2222部分组合在一起的任何想法? – AM94

回答

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 
+0

对不起,我没有完全清楚如何使用这个功能,当我的第一列的模式不重复定期。也许我错过了一些东西.... – AM94

+0

@ AM94编辑你的问题,包括一个更具代表性的例子 –

+0

@PaulH我试图用目前的阶段更新它,欢呼! – AM94

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 

作为认定中点和梯度,我猜这些都是熊猫的,但你可以找出情况:其中在列中的数据x等于2 for循环,并且如果语句:

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

感谢您的这一点,我似乎无法得到“如果行的值是x,并且下面的行是y”的代码在数据框设置中是正确的。 – AM94