Python 获取每个组第一次出现的条件的列值

Python 获取每个组第一次出现的条件的列值,python,pandas,lambda,group-by,apply,Python,Pandas,Lambda,Group By,Apply,我有一个熊猫数据框,如下所示: player condition num A 0 1 A 1 2 A 1 3 B 0 1 B 0 2 B 1 3 B 0 4 我想添加一个列来存储num列的最小值,其中每player的条件列为1 因此,结果应如下所示: player

我有一个熊猫数据框,如下所示:

player  condition   num
A       0           1
A       1           2
A       1           3
B       0           1
B       0           2
B       1           3
B       0           4
我想添加一个列来存储
num
列的最小值,其中每
player
条件
列为1

因此,结果应如下所示:

player  condition   num  numCondition
A       0           1    2
A       1           2    2
A       1           3    2
B       0           1    3
B       0           2    3
B       1           3    3
B       0           4    3
我知道我需要一个
groupBy()
per
player
。然后我需要一个
apply()
,可能需要使用
lambda()
函数。但我还不能把这些碎片拼在一起


编辑:在我的示例中,
条件
列是一种简化。实际上,应该可以使用通常的数据帧查询来过滤行。例如,
df[(df.condition==1)和(df.otherCondition>10)]
首先聚合,然后在
播放器上加入
df

df.join(
    df.groupby('player')
      .apply(lambda g: g.num[g.condition == 1].min())
      .rename('numCondition'), 
on='player')

# player  condition   num   numCondition
#0     A          0     1   2
#1     A          1     2   2
#2     A          1     3   2
#3     B          0     1   3
#4     B          0     2   3
#5     B          1     3   3
#6     B          0     4   3

首先聚合,然后在
player
上使用
df
加入:

df.join(
    df.groupby('player')
      .apply(lambda g: g.num[g.condition == 1].min())
      .rename('numCondition'), 
on='player')

# player  condition   num   numCondition
#0     A          0     1   2
#1     A          1     2   2
#2     A          1     3   2
#3     B          0     1   3
#4     B          0     2   3
#5     B          1     3   3
#6     B          0     4   3

通过使用
删除重复项

df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num)
    Out[221]: 
    0    2
    1    2
    2    2
    3    3
    4    3
    5    3
    6    3
    Name: player, dtype: int64

df['numCondition']=df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num)
df
Out[223]: 
  player  condition  num  numCondition
0      A          0    1             2
1      A          1    2             2
2      A          1    3             2
3      B          0    1             3
4      B          0    2             3
5      B          1    3             3
6      B          0    4             3

通过使用
删除重复项

df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num)
    Out[221]: 
    0    2
    1    2
    2    2
    3    3
    4    3
    5    3
    6    3
    Name: player, dtype: int64

df['numCondition']=df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num)
df
Out[223]: 
  player  condition  num  numCondition
0      A          0    1             2
1      A          1    2             2
2      A          1    3             2
3      B          0    1             3
4      B          0    2             3
5      B          1    3             3
6      B          0    4             3

如果某一组从未满足该条件,会发生什么?也就是说,在一组中从来没有值
1
?它为该玩家提供所有
NaN
s。
numCondition
列中的
NaN
s?如果是,更换
NaN
s的最快方法是什么?是。这就是它在版本
'0.20.3'
上的行为。您想用什么替换它?您应该能够使用
fillna(0)
来执行此操作,如果要将
NaN
s替换为零。如果一个组从未满足此条件,会发生什么情况?也就是说,在一组中从来没有值
1
?它为该玩家提供所有
NaN
s。
numCondition
列中的
NaN
s?如果是,更换
NaN
s的最快方法是什么?是。这就是它在版本
'0.20.3'
上的行为。您想用什么替换它?如果您想用zero.thx替换
NaN
s,您应该可以使用
fillna(0)
say来执行此操作!如果某一组从未满足该条件,会发生什么?也就是说,一个组中从来没有值1?@beta将是NaN替换NaN,可以通过
replace
fillna
thx!如果某一组从未满足该条件,会发生什么?也就是说,一个组中从来没有值1?@beta将是NaN替换NaN,可以通过
replace
fillna