大熊猫将个人逻辑应用于群组

时间:2016-09-07 16:01:42

标签: python pandas

如果我有一个看起来像的pandas数据框:

day id  val
1-Jan   A   -5
2-Jan   A   -4
3-Jan   A   3
1-Jan   B   2
2-Jan   B   1
3-Jan   B   -5

如何添加新列,对于具有相同id的所有行,如果1月1日val为负,则所有行都为" Y"和" N"如果不?像这样的东西:

day id  val neg_on_jan_1
1-Jan   A   -5  y
2-Jan   A   -4  y
3-Jan   A   3   y
1-Jan   B   2   n
2-Jan   B   1   n
3-Jan   B   -5  n

我看过group by和apply-lambda函数,但仍觉得我错过了什么。我刚刚开始使用pandas,来自SQL背景,所以请原谅我,如果我的大脑仍在思考行和Oracle分析函数:)

1 个答案:

答案 0 :(得分:2)

根据@Ami Tavory的建议包含map

gb = df.set_index(['day', 'id']).groupby(level='id')
s = gb.val.transform(lambda s: s.loc['1-Jan'].lt(0)).map({1: 'y', 0:'n'})
s

day    id
1-Jan  A     y
2-Jan  A     y
3-Jan  A     y
1-Jan  B     n
2-Jan  B     n
3-Jan  B     n
Name: val, dtype: object
df.merge(s.to_frame('neg_on_jan_1').reset_index())

enter image description here