我的数据框中有两列: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()生成统计数据,我希望我能够提取和绘制数据?
答案 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