Python 熊猫基于通配符输入特定ID

Python 熊猫基于通配符输入特定ID,python,pandas,Python,Pandas,我有下面的数据框,其中一个实验可以有多行,因为每个实验都有不同的标记。我创建了一个名为“注册”字段的新列。基本上,我想通配符“多输入字段”,将包含此标记的所有实验都输入为注册字段。当我有多行用于单个实验,并且我想输入包含此标记的每个实验时,我如何做到这一点 这是我的DF experiment company tag sign_up_field 1 facebook Multiple input field NaN 1

我有下面的数据框,其中一个实验可以有多行,因为每个实验都有不同的标记。我创建了一个名为“注册”字段的新列。基本上,我想通配符“多输入字段”,将包含此标记的所有实验都输入为注册字段。当我有多行用于单个实验,并且我想输入包含此标记的每个实验时,我如何做到这一点

这是我的DF

experiment company    tag                    sign_up_field
1          facebook   Multiple input field   NaN
1          facebook   One button             NaN
1          facebook   Get Started            NaN

我的预期产出是

experiment company    tag                    sign_up_field
1          facebook   Multiple input field   1
1          facebook   One button             1
1          facebook   Get Started            1

我试过了

df['sign\u field'].loc[df['tag'].str.contains('Multiple input field',flags=re.IGNORECASE)]=1


但这只会在我要插补所有3个时输入第一行,因为它们是相同的实验。

如果我理解正确,您需要的是以下内容:

  • 获取标记列中至少有一行具有“多输入字段”的所有实验
  • 将所有这些字段的“签名字段”列设置为1
  • 如果是这种情况,可以使用以下代码实现:

    experiments=df.loc[df['tag'].str.contains('Multiple input field',flags=re.IGNORECASE),'experiments']
    df.loc[df['experiment'].isin(experiments),'sign_up_field']=1
    
    考虑到字符串是完全匹配的,而不是正则表达式,您可以更简洁:

    experiments=df.loc[df['tag']=='Multiple input field','experiments']
    df.loc[df['experiment'].isin(experiments),'sign_up_field']=1
    
    如果
    experiment
    是索引而不是列,则需要更改此行:

    experiments=df.loc[df['tag']=='Multiple input field','experiments']
    
    对于这一点:

    experiments=df.loc[df['tag']=='Multiple input field'].index
    
    尝试两个步骤
    转换

    df['sign_up_field'] = df['tag'].str.contains('Multiple input field', flags=re.IGNORECASE)]
    
    df['sign_up_field'] = df.groupby('experiment')['sign_up_field'].transform('any')
    

    这太棒了。如果有多个像这样的实验需要通配符呢?有没有比每次为不同的通配符创建一个实验变量更好的方法?这适用于至少有一行“多输入字段”的任意数量的实验。如果您有多个字符串,则可以执行
    df['tag'].isin(['Multiple input field','Other string','A third string'])
    而不是
    df['tag']==='Multiple input field'
    。你应该用至少一根这样的弦来收集所有的实验。这就是你的意思吗?是的,但我试图在第一个方法中使用通配符语句,我可以为多个标记执行str.contains吗?是的,但看起来不太好。您需要在标记之间使用正则表达式表示“OR”,即管道(“|”)。例如,这与3行匹配:
    pd.Series(['A','B','C']).str.contains(“A | B | C”)
    。如果答案解决了您的问题,请记住接受并向上投票!)