使用3个现有列上的条件在pandas数据框中添加一列

时间:2019-07-07 02:00:47

标签: python pandas

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

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

我需要为每组“代码”添加一个值为0或1的“ new_column”,具体取决于以下条件:

仅当特定“代码”的所有“标签”都填入“ new_column”中的1 “标签”列中的值等于1。注意,我需要为属于该特定“代码”的所有行填充1。

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

现有表格:

   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 

我尚未尝试任何解决方案,因为它似乎超出了我目前的专业水平。

2 个答案:

答案 0 :(得分:1)

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

df['new_column'] = df.groupby('code')['tag'].transform(all).astype(int)

transform方法适用于传递给数据帧的任何数据帧,并保持轴长相同。

文档中的简单示例清楚地说明了用法。

出现此特定问题时,运行此代码段会发生以下情况:

  • 您首先要对“代码”进行分组。您最终得到一个DataFrameGroupBy对象。
  • 接下来,从中选择tag列,最后以SeriesGroupBy对象结束。
  • 为此分组,您通过all应用transform函数,最终将布尔值类型转换为int
  • 基本上,您可以这样理解它(值是二进制的,以使它们与您的答案更相关):
>>> int(all([1, 1, 1, 1]))
1
>>> int(all([1, 0, 1, 1]))
0

最后,您要将刚创建的列分配给旧数据框的列new_column

答案 1 :(得分:0)

user3483203的初始答案有效。这是一个变化。但是他的方式更加简洁。

enter image description here