首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中基于两行之间的匹配使用[0,1]创建新列

在Python中基于两行之间的匹配使用[0,1]创建新列
EN

Stack Overflow用户
提问于 2021-02-12 22:07:58
回答 2查看 94关注 0票数 1

我正在尝试将多个列表或数据帧与一个大的基本数据帧进行比较。然后,对于任何匹配,我想追加一个存储1=匹配或0=无匹配的列

代码语言:javascript
运行
复制
df = pd.DataFrame({'Name':['A','B','C','D'], 'ID' : ['5-6','6-7','8-9','7']})
list1 = ['5-6','8-9']
list2 = ['7','4-3']

因为我尝试匹配的值包括一个'-‘,所以它们被算作字符串。我已经可以生成一个匹配值的列表,但是如果我追加它们,它们都是0

代码语言:javascript
运行
复制
def f(rows):
    for i in df['ID']:
        for j in list1:
            if i == j:
                val = 1
            else:
                val = 0
            return val

df['Answer']= df.apply(f,axis=1)

代码语言:javascript
运行
复制
for i in df['ID']:
    for j in  list1:
        if i == j:
           print (i)

查找所有匹配值。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-12 22:25:03

您已经通过.apply进行了循环,因此可以省略循环,并使用in作为list的成员:

代码语言:javascript
运行
复制
def f(rows):
    if rows['ID'] in list1:
        val = 1
    else:
        val = 0
    return val

df['Answer']= df.apply(f,axis=1)
print (df)
  Name   ID  Answer
0    A  5-6       1
1    B  6-7       0
2    C  8-9       1
3    D    7       0

更简单是使用带有指定列的lambda函数:

代码语言:javascript
运行
复制
df['Answer']= df['ID'].apply(lambda x: 1 if x in list1 else 0)

或者:

代码语言:javascript
运行
复制
df['Answer']= df['ID'].apply(lambda x: int(x in list1))
票数 2
EN

Stack Overflow用户

发布于 2021-02-12 22:43:15

在这里,您可以使用DataFrame.isin代替循环,

代码语言:javascript
运行
复制
df['Answer'] = df['ID'].isin(list1).astype(int)

    Name    ID  Answer
0   A       5-6 1
1   B       6-7 0
2   C       8-9 1
3   D       7   0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66173302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档