【问题标题】:Make new column based on only the first value of another column while fill others with 0仅根据另一列的第一个值创建新列,同时用 0 填充其他列
【发布时间】:2022-12-18 12:44:54
【问题描述】:

我有一个数据框和一个密钥,key[1,2,3,4]

Animal Arm 
1      2
1      4
1      3
1      3
1      1
1      1

我想创建一个名为 response 的新列,条件是如果 arm 值在键中,则响应等于 1,否则响应等于 0。然而,诀窍在于它应该只针对第一个值,并且任何重复的 arm 值都应该产生 response 作为 0。像这样 :

Animal  Arm  Response
1       2    1  
1       4    1
1       3    1
1       3    0
1       1    1
1       1    0

最多只能有 4 个值为 response1

这是我试过的:

resp = []    
for i in range(len(df3)):
            for j in key:
                if df['Arm'][i] == j:
                    resp.append(1)
                    break
            else: resp.append(0)


df['Response'] = resp

但我不知道如何只将键的第一个值设置为 1,并将值的任何重复设置为零。

有人可以帮忙吗?

【问题讨论】:

  • 您是否需要根据 AnimalArm 检查重复项?还是仅根据Arm

标签: python python-3.x pandas dataframe group-by


【解决方案1】:

Series.isinDataFrame.duplicated 一起使用 - 每两列都测试AnimalArm 的重复值,换句话说,Arm 的重复值由Animal 按组测试:

df['Response'] = (df['Arm'].isin(key) & ~df.duplicated(['Animal','Arm'])).astype(int)
print (df)
   Animal  Arm  Response
0       1    2         1
1       1    4         1
2       1    3         1
3       1    3         0
4       1    1         1
5       1    1         0

添加数据以查看差异:

key = [1,2,3,4]
df['Response'] = (df['Arm'].isin(key) & ~df.duplicated(['Animal','Arm'])).astype(int)
print (df)
    Animal  Arm  Response
0        1    2         1
1        1    4         1
2        1    3         1
3        1    3         0
4        1    1         1
5        1    1         0
6        2    2         1
7        2    4         1
8        2    3         1
9        2    3         0
10       2    1         1
11       2    1         0 

【讨论】:

  • 您只是将答案更改为与我的相同:(
  • @mozway - 再检查一次。
  • 它实际上是一样的,没有描述 Animal 有任何作用
  • 在这种情况下,最好是对答案发表评论,而不是替换你的答案……无论如何,这不像是第一次……你原来的答案是完全不同的
  • @mozway - 不明白你的问题,添加答案,添加条件,答案与你的不同,那么问题是什么?如果我问你同样的问题,那完全没问题,但现在有什么问题吗?
【解决方案2】:

您可以将 isinduplicated 结合使用:

df['Response'] = (df['Arm'].isin(key)&~df['Arm'].duplicated()).astype(int)

或者:

df['Response'] = np.where(df['Arm'].isin(key)&~df['Arm'].duplicated(), 1, 0)

输出:

   Animal  Arm  Response
0       1    2         1
1       1    4         1
2       1    3         1
3       1    3         0
4       1    1         1
5       1    1         0

【讨论】:

  • @Kshtj 还有哪些价值观?你能举个例子说明你的问题吗?
【解决方案3】:
resp = [] 
respDone= []
for i in range(len(df)):
    for j in key:
        if df['Arm'][i] == j and df["Arm"][i] not in respDone:
            resp.append(1)
            respDone.append(df["Arm"][i])
            break
    else: resp.append(0)


df['Response'] = resp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多