Python 使用3个现有列上的条件在dataframe中添加列

Python 使用3个现有列上的条件在dataframe中添加列,python,pandas,Python,Pandas,我有一个现有的Pandas数据帧,我想根据以下模式对其进行操作: 现有表在“代码”列中有不同的代码集。每个“代码”都在“标签”列中列出了某些标签。每个标签都已标记为0或1 根据以下条件,我需要为每组“代码”添加一个值为0或1的“新_列”: 仅当某一特定“代码”的所有“标签”均已删除时,才在“新_列”中填写1 在“标记”列中的值等于1。注:我需要为属于该特定“代码”的所有行填写1 如所需表格所示,只有code=30的“标签”列中的所有“标签”设置为1。因此,对于特定代码,我将“new_column

我有一个现有的Pandas数据帧,我想根据以下模式对其进行操作:

现有表在“代码”列中有不同的代码集。每个“代码”都在“标签”列中列出了某些标签。每个标签都已标记为0或1

根据以下条件,我需要为每组“代码”添加一个值为0或1的“新_列”:

仅当某一特定“代码”的所有“标签”均已删除时,才在“新_列”中填写1 在“标记”列中的值等于1。注:我需要为属于该特定“代码”的所有行填写1

如所需表格所示,只有code=30的“标签”列中的所有“标签”设置为1。因此,对于特定代码,我将“new_column”设置为1。其余代码已设置为0值

现有表格: 所需表格
我还没有尝试过任何解决方案,因为这似乎超出了我目前的专业水平。

我认为这个问题的正确答案是@user3483203在评论中给出的:

df['new_column']=df.groupby('code')['tag'].transform(all).astype(int)
该方法应用于数据帧,无论传递给它的是什么,保持轴长度不变

文档中的简单示例清楚地解释了该用法

关于这个问题,运行此代码段时会发生以下情况:

  • 首先执行与“代码”相关的分组。最终将得到一个
    DataFrameGroupBy
    对象
  • 接下来,从中选择
    标记
    列,以
    SeriesGroupBy
    对象结束
  • 对于该分组,您可以通过
    transform
    应用
    all
    函数,最终将布尔值键入
    int
  • 基本上,您可以这样理解它(值是二进制的,以便与您的答案更相关):
>>int(所有([1,1,1,1]))
1.
>>>int(所有([1,0,1,1]))
0

最后,您将刚刚创建的列分配给列
new\u column
给旧数据帧。

用户3483203的初始答案有效。这是一个变体。但他的方式更简洁


df.groupby('code')['tag'].transform(all).astype(int)
感谢您的及时回复,但我看不到在您的code@M.Mufti,我可以验证user3483203代码是否正在处理您给定的测试数据,并且我相信它是基于此问题中提到的逻辑的正确代码。我支持@ScottBoston's Comments Third@ScottBoston's commentHi,我没有理由不同意此解决方案,但我仍在努力获得所需的结果。新的_列显示所有零。是否有人可以提供建议。找到了未获得所需结果的原因,但它为我的原始查询添加了另一个问题。还有一列名为“category”,还有一列名为“category”,有3个值,例如1、2和3。“类别”1中“代码”的“标记”不一定相同,因为“代码”30的转换(全部)返回False。我认为最好为更改的场景发布新的查询,但是我通过接受答案来结束当前查询。我不认为我完全理解新的场景。正如你自己建议的那样,你可以提出一个新问题(前提是这个问题还不存在)。谢谢
   code  label  tag
0   10    AAA    0
1   10    BBB    1
2   10    CCC    0
3   10    DDD    0
4   10    EEE    0
5   20    AAA    1
6   20    CCC    0
7   20    DDD    1
8   30    BBB    1
9   30    CCC    1
10  30    EEE    1
   code  label  tag  new_column
0   10    AAA    0       0
1   10    BBB    1       0
2   10    CCC    0       0
3   10    DDD    0       0
4   10    EEE    0       0
5   20    AAA    1       0
6   20    CCC    0       0
7   20    DDD    1       0
8   30    BBB    1       1
9   30    CCC    1       1
10  30    EEE    1       1