Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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 如何创建基于列值具有累积和且具有分组依据的两列_Python_Python 3.x_Pandas - Fatal编程技术网

Python 如何创建基于列值具有累积和且具有分组依据的两列

Python 如何创建基于列值具有累积和且具有分组依据的两列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在使用python3.7在pandas中创建以下数据帧 data = {'s':['a','a','a','a','b','b'], 'cp':['C','P','C','C','C','P'], 'st':[300,300,300,300,310,310], 'qty':[3000,3000,3000,6000,9000,3000], 'p':[16,15,14,10,8,12]} df=pd.DataFrame(data

我正在使用python3.7在pandas中创建以下数据帧

data = {'s':['a','a','a','a','b','b'],
        'cp':['C','P','C','C','C','P'],
        'st':[300,300,300,300,310,310],
         'qty':[3000,3000,3000,6000,9000,3000],
         'p':[16,15,14,10,8,12]}
df=pd.DataFrame(data)
df['t']=df['p']*df['qty']
df['ct']=df['t'].cumsum()
df

s   cp  st  qty p   t   ct
0   a   C   300 3000    16  48000   48000
1   a   P   300 3000    15  45000   93000
2   a   C   300 3000    14  42000   135000
3   a   C   300 6000    10  60000   195000
4   b   C   310 9000    8   72000   267000
5   b   P   310 3000    12  36000   303000
我想创建两个独立的列,即基于S的x和y,以及具有数量累积和的CP值

col x = cumm qty where cp="c" group by col s
col y = cumm qty where cp=P group by col s

    s   cp  st  qty p   t   ct                x      y
0   a   C   300 3000    16  48000   48000     3000     0
1   a   P   300 3000    15  45000   93000     3000   3000
2   a   C   300 3000    14  42000   135000    6000   3000
3   a   C   300 6000    10  60000   195000   12000   3000
4   b   C   310 9000    8   72000   267000    9000     0
5   b   P   310 3000    12  36000   303000    9000   3000

I tried something like this

df['x']=df.loc[df['p']>0].groupby(['s'])['s','cp','qty','ct'].apply(lambda x:x['qty'].cumsum() if x['cp']=="C" else 0) 
它给出了以下错误 级数的真值是模糊的。使用a.empty、a.bool()、a.item()、a.any()或a.all()

我也不确定它会在哪里给我预期的输出。你能帮我吗?

你可以使用:

df['X']=df.where(df['cp'].eq('C')).groupby('s')['qty'].cumsum().fillna(df['qty'])
df['Y']=0
df.loc[~df['cp'].shift(-1).eq('P'),'Y']=df.loc[df['cp'].eq('P'),'qty']
df=df.ffill()

您可以使用:

df['X']=df.where(df['cp'].eq('C')).groupby('s')['qty'].cumsum().fillna(df['qty'])
df['Y']=0
df.loc[~df['cp'].shift(-1).eq('P'),'Y']=df.loc[df['cp'].eq('P'),'qty']
df=df.ffill()

这是我的解决办法

df['x'] = df['qty'].mul(df['cp'].eq('C')).groupby(df['s']).cumsum()
df['y'] = df['qty'].mul(df['cp'].eq('P')).groupby(df['s']).cumsum()
输出:

   s cp   st   qty   p      t      ct      x     y
0  a  C  300  3000  16  48000   48000   3000     0
1  a  P  300  3000  15  45000   93000   3000  3000
2  a  C  300  3000  14  42000  135000   6000  3000
3  a  C  300  6000  10  60000  195000  12000  3000
4  b  C  310  9000   8  72000  267000   9000     0
5  b  P  310  3000  12  36000  303000   9000  3000
这是我的解决办法

df['x'] = df['qty'].mul(df['cp'].eq('C')).groupby(df['s']).cumsum()
df['y'] = df['qty'].mul(df['cp'].eq('P')).groupby(df['s']).cumsum()
输出:

   s cp   st   qty   p      t      ct      x     y
0  a  C  300  3000  16  48000   48000   3000     0
1  a  P  300  3000  15  45000   93000   3000  3000
2  a  C  300  3000  14  42000  135000   6000  3000
3  a  C  300  6000  10  60000  195000  12000  3000
4  b  C  310  9000   8  72000  267000   9000     0
5  b  P  310  3000  12  36000  303000   9000  3000

我试过了,它在一列中给出了cumsum,我想要分开两列,一列有cp值“C”,另一列有cp值“P”,我试过了,它在一列中给出了cumsum,我想要分开两列,一列有cp值“C”,另一列有cp值“P”感谢您的帮助,但您的代码没有为s值提供正确的值。例如,b c 310 9000 8 72000 267000它的值应为9000、0以及x和y,下一行的x和y值应为9000 3000您的x e解决方案,我不明白您是如何得到它们的,我认为它们是错误的。我不明白标准是什么,x列=数量的总和,其中cp=“C”,但它应该根据s值计算总和,y列与x列相同,只是值为“P”。e、 s的g值是a,cp是C数量=10(第一行),然后x,y应该是10,第二行的0值是a,P,20,然后第二行的x和y应该是10,第三行的20值是b,C,15,然后x和y应该是15,第四行的0值是a,C,8,然后值应该是18,20希望能清楚地解释谢谢你的帮助。我会检查的。有一个问题是,等式是否需要f['cp']所述的eq。eq('C')或它也可以检查为==吗?谢谢您的帮助,但您的代码没有为s值提供正确的值。例如,b C 310 9000 8 72000 267000它应该有值9000,0,对于x和y,对于下一行,x和y的值应该是9000,对于x e,我不明白你是如何得到它们的,我认为它们是错误的。我不明白标准是什么,x列=数量的总和,其中cp=“C”,但它应该根据s值计算总和,y列与x列相同,只是值为“P”。e、 s的g值是a,cp是C数量=10(第一行),然后x,y应该是10,第二行的0值是a,P,20,然后第二行的x和y应该是10,第三行的20值是b,C,15,然后x和y应该是15,第四行的0值是a,C,8,然后值应该是18,20希望能清楚地解释谢谢你的帮助。我会检查的。有一个问题是,等式是否需要f['cp']中提到的eq。eq('C')或者也可以检查为==呢?谢谢你的帮助。它正在工作。帮了大忙。你能解释一下你为什么用mul吗?np.where或lambda?mul表示乘法,因此您将
C
屏蔽为1,将
P
屏蔽为0。谢谢您的帮助。它正在工作。帮了大忙。你能解释一下你为什么用mul吗?np.where或lambda?mul表示乘法,因此您将
C
屏蔽为1,将
P
屏蔽为0。