python - 根据条件在 df 的新列中添加值
问题描述
我有以下df
排序 bydate
和 by 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 中生成一个新的column
(称为result
),如果其中一个值与name
之后的值相同,则将它们一起添加到新列中。
所需的输出如下所示:
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]
indexing error
输出指示string index out of range
,但是我相信应该有更有效的方法来获得所需的输出。
感谢您阅读我的帖子。
解决方案
你应该使用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
推荐阅读
- chapel - Fortran 的教堂模拟做循环增量?
- python - python中的布尔递归
- mongodb - mongodb 通过查询字段只返回子文档
- .net - 整个 WPF ListView 中的内部网格线
- java - 响应消息:java.sql.SQLException:无法转换为内部表示:jmeter
- java - 我的导航栏上的第一个图标是蓝色的,并且比其他图标大,我该如何更改?
- python - 线程比多个笔记本慢
- distributed-computing - 有没有办法将区块链账本副本相对化?
- javascript - Three.js:父级旋转的 LookAt
- java - 从扩展 MainActivity 的类中调用 public void