Python 按ID分组并对一列的值应用条件
我是熊猫图书馆的新手,非常感谢您的帮助。 这是我的意见 身份证件 日期 标签 股票 AA 01/26/2020 正确 100 AA 01/27/2020 错误的 200 BB 01/28/2020 错误的 300 BB 01/29/2020 正确 500 BB 01/30/2020 错误的 100 科科斯群岛 01/26/2020 正确 200 科科斯群岛 01/27/2020 错误的 300 科科斯群岛 01/28/2020 错误的 100 科科斯群岛 01/29/2020 正确 400Python 按ID分组并对一列的值应用条件,python,pandas,dataframe,jupyter-notebook,Python,Pandas,Dataframe,Jupyter Notebook,我是熊猫图书馆的新手,非常感谢您的帮助。 这是我的意见 身份证件 日期 标签 股票 AA 01/26/2020 正确 100 AA 01/27/2020 错误的 200 BB 01/28/2020 错误的 300 BB 01/29/2020 正确 500 BB 01/30/2020 错误的 100 科科斯群岛 01/26/2020 正确 200 科科斯群岛 01/27/2020 错误的 300 科科斯群岛 01/28/2020 错误的 100 科科斯群岛 01/29/2020 正确 400 将双
将双布尔值与
.duplicated()
查看每一个布尔值,我们只需要两者都为真的值
df.assign(ky1=df['LABEL'].eq(True),
ky2=df.duplicated(subset=['ID'],keep='last')
)
ID DATE LABEL STOCK NEW ky1 ky2
0 AA 01/26/2020 True 100 100.0 True True
1 AA 01/27/2020 False 200 NaN False False
2 BB 01/28/2020 False 300 NaN False True
3 BB 01/29/2020 True 500 500.0 True True
4 BB 01/30/2020 False 100 NaN False False
5 CC 01/26/2020 True 200 200.0 True True
6 CC 01/27/2020 False 300 NaN False True
7 CC 01/28/2020 False 100 NaN False True
8 CC 01/29/2020 True 400 NaN True False
另一个版本,使用
.groupby()
:
印刷品:
ID日期标签库存新
0 AA 01/26/2020真实100.0
1 AA 01/27/2020假200南
2 BB 01/28/2020假300南
3 BB 01/29/2020真实500.0
4 BB 01/30/2020假100 NaN
5 CC 01/26/2020真实200.0
6 CC 01/27/2020假300南
7 CC 01/28/2020假100 NaN
8 CC 01/29/2020真实400 NaN
到目前为止,您尝试了什么?您的代码是什么样子的?我尝试了groupby和apply,后来又尝试了transform,但我无法编写lambda函数。看起来您希望使用groupby ID,然后使用运算符“groupby.first”。这将为您提供所需的数据帧。
df.assign(ky1=df['LABEL'].eq(True),
ky2=df.duplicated(subset=['ID'],keep='last')
)
ID DATE LABEL STOCK NEW ky1 ky2
0 AA 01/26/2020 True 100 100.0 True True
1 AA 01/27/2020 False 200 NaN False False
2 BB 01/28/2020 False 300 NaN False True
3 BB 01/29/2020 True 500 500.0 True True
4 BB 01/30/2020 False 100 NaN False False
5 CC 01/26/2020 True 200 200.0 True True
6 CC 01/27/2020 False 300 NaN False True
7 CC 01/28/2020 False 100 NaN False True
8 CC 01/29/2020 True 400 NaN True False
m = df.index.isin(
df[df["LABEL"] == True].reset_index().groupby("ID").index.first()
)
df.loc[m, "NEW"] = df.loc[m, "STOCK"]
print(df)