Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中跨交叉表的特定行和列执行计算?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何在pandas中跨交叉表的特定行和列执行计算?

Python 如何在pandas中跨交叉表的特定行和列执行计算?,python,pandas,dataframe,Python,Pandas,Dataframe,对于每个组(G1、G2),是否可以仅为c4==2计算ax-bx和ay-by,并将结果放入数据框中: import pandas as pd import numpy as np c1 = np.repeat(['a','b'], [50, 50], axis=0) c2 = list('xy'*50) c3 = np.repeat(['G1','G2'], [50, 50], axis=0) np.random.shuffle(c3) c4=np.repeat([1,2], [50,50],a

对于每个组(G1、G2),是否可以仅为
c4==2
计算
ax-bx
ay-by
,并将结果放入数据框中:

import pandas as pd
import numpy as np

c1 = np.repeat(['a','b'], [50, 50], axis=0)
c2 = list('xy'*50)
c3 = np.repeat(['G1','G2'], [50, 50], axis=0)
np.random.shuffle(c3)
c4=np.repeat([1,2], [50,50],axis=0)
np.random.shuffle(c4)
val = np.random.rand(100)

df = pd.DataFrame({'c1':c1, 'c2':c2, 'c3':c3, 'c4':c4, 'val':val})

table = pd.crosstab([df.c1,df.c2],[df.c3,df.c4])
c3     G1      G2    
c4      1   2   1   2
c1 c2                
a  x    3  11   5   6
   y    9   5   7   4
b  x    5   7  11   2
   y    5   5   5  10
编辑:如果
df
是这种格式,我怎么做

x G1  4
y G1  0
x G2  4
y G2 -6
您可以这样做:

c1 = np.repeat(['a','b'], [8, 8], axis=0)
c2 = list('xxxxyyyyxxxxyyyy')
c3 = ['G1','G1','G2','G2','G1','G1','G2','G2','G1','G1','G2','G2','G1','G1','G2','G2']
c4 = [1,2]*8
val = np.random.rand(16)
df = pd.DataFrame({'c1':c1,'c2':c2,'c3':c3,'c4':c4,'val':val})
或者,将
as_index=False
传递给
groupby
并在
lambda
中使用
loc
,这在IMHO中更有意义,因为您是按名称而不是整数位置进行索引:

In [6]: table
Out[6]:
c3     G1      G2
c4      1   2   1  2
c1 c2
a  x    6   5   8  6
   y    9   4   5  7
b  x    5  10   4  6
   y    7   4   6  8

In [7]: g = table.xs(2, level='c4', axis=1)

In [8]: g
Out[8]:
c3     G1  G2
c1 c2
a  x    5   6
   y    4   7
b  x   10   6
   y    4   8

In [9]: g.groupby(level='c2').apply(lambda x: x.iloc[0] - x.iloc[1])
Out[9]:
c3  G1  G2
c2
x   -5   0
y    0  -1
as_index
apply
仅在pandas git master上有效。如果您没有使用master,则会得到以下结果:

In [11]: g.groupby(level='c2', as_index=False).apply(lambda x: x.loc['a'] - x.loc['b'])
Out[11]:
c3  G1  G2
c2
x   -5   0
y    0  -1
您可以通过重新指定
r
index
属性来删除重复的
索引

In [12]: r = g.groupby(level='c2').apply(lambda x: x.loc['a'] - x.loc['b'])

In [13]: r
Out[13]:
c3     G1  G2
c2 c2
x  x   -5   0
y  y    0  -1
编辑:如果您有一个“熔化的”
数据帧,请执行以下操作:

In [28]: r.index = r.index.droplevel(0)

In [29]: r
Out[29]:
c3  G1  G2
c2
x   -5   0
y    0  -1
每当我不确定组在
groupby
操作中的外观时,我将迭代
groupby
并打印出其组成部分:

In [28]: df
Out[28]:
   c1 c2  c3  c4    val
0   a  x  G1   1  0.244
1   a  x  G1   2  0.572
2   a  x  G2   1  0.837
3   a  x  G2   2  0.893
4   a  y  G1   1  0.951
5   a  y  G1   2  0.400
6   a  y  G2   1  0.391
7   a  y  G2   2  0.237
8   b  x  G1   1  0.904
9   b  x  G1   2  0.811
10  b  x  G2   1  0.536
11  b  x  G2   2  0.736
12  b  y  G1   1  0.546
13  b  y  G1   2  0.159
14  b  y  G2   1  0.735
15  b  y  G2   2  0.772

In [29]: g2 = df[df.c4 == 2]

In [30]: g2
Out[30]:
   c1 c2  c3  c4    val
1   a  x  G1   2  0.572
3   a  x  G2   2  0.893
5   a  y  G1   2  0.400
7   a  y  G2   2  0.237
9   b  x  G1   2  0.811
11  b  x  G2   2  0.736
13  b  y  G1   2  0.159
15  b  y  G2   2  0.772

In [31]: gb = g2.groupby(['c2', 'c3'])

In [32]: sub = gb.apply(lambda x: x.val.iloc[0] - x.val.iloc[1])

In [33]: sub
Out[33]:
c2  c3
x   G1   -0.239
    G2    0.157
y   G1    0.241
    G2   -0.535
dtype: float64

In [34]: sub.unstack()
Out[34]:
c3     G1     G2
c2
x  -0.239  0.157
y   0.241 -0.535
这些是
lambda x:…
中的
x
,传递给
groupby.apply()

您可以执行以下操作:

c1 = np.repeat(['a','b'], [8, 8], axis=0)
c2 = list('xxxxyyyyxxxxyyyy')
c3 = ['G1','G1','G2','G2','G1','G1','G2','G2','G1','G1','G2','G2','G1','G1','G2','G2']
c4 = [1,2]*8
val = np.random.rand(16)
df = pd.DataFrame({'c1':c1,'c2':c2,'c3':c3,'c4':c4,'val':val})
或者,将
as_index=False
传递给
groupby
并在
lambda
中使用
loc
,这在IMHO中更有意义,因为您是按名称而不是整数位置进行索引:

In [6]: table
Out[6]:
c3     G1      G2
c4      1   2   1  2
c1 c2
a  x    6   5   8  6
   y    9   4   5  7
b  x    5  10   4  6
   y    7   4   6  8

In [7]: g = table.xs(2, level='c4', axis=1)

In [8]: g
Out[8]:
c3     G1  G2
c1 c2
a  x    5   6
   y    4   7
b  x   10   6
   y    4   8

In [9]: g.groupby(level='c2').apply(lambda x: x.iloc[0] - x.iloc[1])
Out[9]:
c3  G1  G2
c2
x   -5   0
y    0  -1
as_index
apply
仅在pandas git master上有效。如果您没有使用master,则会得到以下结果:

In [11]: g.groupby(level='c2', as_index=False).apply(lambda x: x.loc['a'] - x.loc['b'])
Out[11]:
c3  G1  G2
c2
x   -5   0
y    0  -1
您可以通过重新指定
r
index
属性来删除重复的
索引

In [12]: r = g.groupby(level='c2').apply(lambda x: x.loc['a'] - x.loc['b'])

In [13]: r
Out[13]:
c3     G1  G2
c2 c2
x  x   -5   0
y  y    0  -1
编辑:如果您有一个“熔化的”
数据帧,请执行以下操作:

In [28]: r.index = r.index.droplevel(0)

In [29]: r
Out[29]:
c3  G1  G2
c2
x   -5   0
y    0  -1
每当我不确定组在
groupby
操作中的外观时,我将迭代
groupby
并打印出其组成部分:

In [28]: df
Out[28]:
   c1 c2  c3  c4    val
0   a  x  G1   1  0.244
1   a  x  G1   2  0.572
2   a  x  G2   1  0.837
3   a  x  G2   2  0.893
4   a  y  G1   1  0.951
5   a  y  G1   2  0.400
6   a  y  G2   1  0.391
7   a  y  G2   2  0.237
8   b  x  G1   1  0.904
9   b  x  G1   2  0.811
10  b  x  G2   1  0.536
11  b  x  G2   2  0.736
12  b  y  G1   1  0.546
13  b  y  G1   2  0.159
14  b  y  G2   1  0.735
15  b  y  G2   2  0.772

In [29]: g2 = df[df.c4 == 2]

In [30]: g2
Out[30]:
   c1 c2  c3  c4    val
1   a  x  G1   2  0.572
3   a  x  G2   2  0.893
5   a  y  G1   2  0.400
7   a  y  G2   2  0.237
9   b  x  G1   2  0.811
11  b  x  G2   2  0.736
13  b  y  G1   2  0.159
15  b  y  G2   2  0.772

In [31]: gb = g2.groupby(['c2', 'c3'])

In [32]: sub = gb.apply(lambda x: x.val.iloc[0] - x.val.iloc[1])

In [33]: sub
Out[33]:
c2  c3
x   G1   -0.239
    G2    0.157
y   G1    0.241
    G2   -0.535
dtype: float64

In [34]: sub.unstack()
Out[34]:
c3     G1     G2
c2
x  -0.239  0.157
y   0.241 -0.535

这些是
lambda x:…
中的
x
s,它被传递到
groupby.apply()

谢谢,它工作得很好!但是,是否可以直接在数据帧上执行相同的计算(我用一个新示例更新了我的问题)?我试着和groupby一起玩,但是没有达到同样的效果。太棒了!非常感谢你的帮助!谢谢,效果很好!但是,是否可以直接在数据帧上执行相同的计算(我用一个新示例更新了我的问题)?我试着和groupby一起玩,但是没有达到同样的效果。太棒了!非常感谢你的帮助!