如果我有一个 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 的所有行,如果 val 在 1 月 1 日为负数,则所有行均为“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 分析函数思考,请原谅我:)
最佳答案
根据 @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())
关于python - pandas 将个体逻辑应用于群体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39374620/