Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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 根据条件在df的新列中添加值_Python_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 根据条件在df的新列中添加值

Python 根据条件在df的新列中添加值,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有以下按日期排序的df和按名称排序的name: date name valor 2 2018-03-01 ACC 75 0 2018-03-01 ACE 50 0 2018-03-20 ACE 50 1 2018-03-01 BBV 20 1 2018-03-14 BBV 20 5 2018-04-16 BBV

我有以下按日期排序的
df
和按名称排序的
name

         date     name   valor 
  2  2018-03-01   ACC      75      
  0  2018-03-01   ACE      50     
  0  2018-03-20   ACE      50   
  1  2018-03-01   BBV      20    
  1  2018-03-14   BBV      20
  5  2018-04-16   BBV      58
  6  2018-04-20   BBV     -58
我期待在df中生成一个新的
(称为
结果
),如果
名称
中的一个值与后面的值相同,则将它们一起添加到新列中

所需的输出如下所示:

     date        name    valor  result 
  2  2018-03-01   ACC      75     75
  0  2018-03-01   ACE      50     50
  0  2018-03-20   ACE      50    100 
  1  2018-03-01   BBV      20     20
  1  2018-03-14   BBV      20     40
  5  2018-04-16   BBV      58     98
  6  2018-04-20   BBV     -58     40 
这就是我正在尝试的:

for index,row in df.iterrows():
    for i in range(1,len(df)+1):
        if (row['name'][i]==row['name'][i+1]) and ( row['name'][i-1]!=row['name'][i]):
            df["result"]=df["valor"][i]+df["valor"][i+1]
        elif (row['name'][i]==row['name'][i+1]) and (row['name'][i-1]==row['name'][i]):
            df["result"]=df["result"][i]+df["valor"][i+1]
一个
索引错误
输出表明
字符串索引超出范围
,但是我相信应该有一种更有效的方法来获得所需的输出


感谢您阅读我的帖子。

您应该使用
groupby.cumsum
来完成此操作。使用
pandas
附带的矢量化功能通常比迭代行更高效、更干净

df['result'] = df.groupby('name')['valor'].cumsum()

print(df)

         date name  valor  result
2  2018-03-01  ACC     75      75
0  2018-03-01  ACE     50      50
0  2018-03-20  ACE     50     100
1  2018-03-01  BBV     20      20
1  2018-03-14  BBV     20      40
5  2018-04-16  BBV     58      98
6  2018-04-20  BBV    -58      40