一旦列从 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                |
+-------+--------------------+

有什么想法吗?谢谢!

totaleather2009 回答:一旦列从 False 变为 True 计算差异

假设每个名称最多有一个 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
本文链接:https://www.f2er.com/20193.html

大家都在问