如何解决一旦列从 False 变为 True 计算差异
我有一个 Pandas 数据框,其组织方式如下:
+-------+-------------------+---------+
| Name | Ready | Apples |
+-------+-------------------+---------+
| Alice | false | 1 |
| Bob | false | 3 |
| Chris | true | 10 |
| Alice | true | 5 |
| Bob | true | 7 |
| Dave | false | NaN |
+-------+-------------------+---------+
我想计算苹果在准备好被计算后的差异 - 所以这就是假变成真的时候。如果他们已经准备好了,我只想要他们拥有的苹果数量。如果他们从未准备好,那就只是 NaN。问题是,在变成真之前,每个人可能会有多条假线。例如,我们可能会看到 Alice 在她最终准备好之前 3 次都没有准备好。
有没有办法对名称进行分组,然后找出何时为假 --> 真来计算苹果的差异?我希望我的输出表看起来像:
+-------+--------------------+
| Name | Collected Apples|
+-------+--------------------+
| Alice | 4 (cuz 5-1 = 4) |
| Bob | 4 |
| Chris | 10 |
| Dave | NaN |
+-------+--------------------+
有什么想法吗?谢谢!
解决方法
假设每个名称最多有一个 True
行和一个 False
行。我们可以pivot
然后从True
中减去False
:
# Pivot to Wide Form
result_df = df.pivot(index='Name',columns='Ready',values='Apples')
# Calculate Results
result_df = (
result_df[True] - result_df[False].fillna(0) # Subtract True from False
).reset_index(name='Collected Apples')
result_df
:
Name Collected Apples
0 Alice 4.0
1 Bob 4.0
2 Chris 10.0
3 Dave NaN
DataFrame 和导入:
import numpy as np
import pandas as pd
df = pd.DataFrame({
'Name': ['Alice','Bob','Chris','Alice','Dave'],'Ready': [False,False,True,False],'Apples': [1.0,3.0,10.0,5.0,7.0,np.nan]
})
,
另一种使用 np.where
的单行方法。更改 False
值的符号:
>>> df.assign(Apples=np.where(df['Ready'] == False,-df['Apples'],df['Apples'])) \
.groupby('Name')['Apples'].sum() \
.reset_index(name='Collected Apples')
Name Collected Apples
0 Alice 4.0
1 Bob 4.0
2 Chris 10.0
3 Dave 0.0
np.where
的详细信息:
>>> df.assign(Apples=np.where(df['Ready'] == False,df['Apples']))
Name Ready Apples
0 Alice False -1.0
1 Bob False -3.0
2 Chris True 10.0
3 Alice True 5.0
4 Bob True 7.0
5 Dave False NaN
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。