Python 根据另一列是否包含每行名称创建新列

Python 根据另一列是否包含每行名称创建新列,python,pandas,Python,Pandas,尝试使用pandas遍历每一行,评估该行的B列值是否包含A列中的任何值,然后填充新的C、D、E列。。。对应于A行中的每个值。下面的代码是我为了获得相同的结果而必须执行的操作,但这里我需要事先知道A行中可能存在哪些值 d = {'country': ["USA", "China", "Singapore"], 'allies': ["Turkey, UK, France, India", "DPRK, Sin

尝试使用pandas遍历每一行,评估该行的B列值是否包含A列中的任何值,然后填充新的C、D、E列。。。对应于A行中的每个值。下面的代码是我为了获得相同的结果而必须执行的操作,但这里我需要事先知道A行中可能存在哪些值

d = {'country': ["USA", "China", "Singapore"], 'allies': ["Turkey, UK, France, India", "DPRK, Singapore", "USA, China"]}
df = pd.DataFrame(data=d)

df["USAally"] = df['allies'].map(lambda x: 1 if "USA" in x else 0)
df["Chinaally"] = df['allies'].map(lambda x: 1 if "China" in x else 0)
df["Singaporeally"] = df['allies'].map(lambda x: 1 if "Singapore" in x else 0)

下面是您的代码的概括,首先获取
字母
列中出现的所有唯一字母,然后逐个循环遍历它们,并基本上按照上面所做的每一步进行操作

complete_letter_set = set(''.join(df['letter'])
for l in complete_letter_set:
    df[f"letter{l}exists"] = df['letter'].map(lambda x: int(l in x))

请注意,我已经将x中的A else 0中的条件
1简化为
int(l in x)
,因为
int(True)=1
int(False)==0

这里是对代码的概括,首先获取
letter
列中出现的所有唯一字母,然后,通过逐个循环,基本上完成上面所做的每一项工作

complete_letter_set = set(''.join(df['letter'])
for l in complete_letter_set:
    df[f"letter{l}exists"] = df['letter'].map(lambda x: int(l in x))

请注意,我已经将x中的A else 0中的条件
1简化为
int(l in x)
,因为
int(True)=1
int(False)==0

您可以在这里使用
get_dummies
来有效地执行此操作:

dummies = (df['allies'].str.get_dummies(sep=', ')
                       .reindex(df['country'].unique(), axis=1)
                       .add_suffix('_ally'))
df.join(dummies)                                             

     country                     allies  USA_ally  China_ally  Singapore_ally
0        USA  Turkey, UK, France, India         0           0               0
1      China            DPRK, Singapore         0           0               1
2  Singapore                 USA, China         1           1               0
在哪里,

dummies

   USA_ally  China_ally  Singapore_ally
0         0           0               0
1         0           0               1
2         1           1               0

您可以在此处使用
get_dummies
有效地执行此操作:

dummies = (df['allies'].str.get_dummies(sep=', ')
                       .reindex(df['country'].unique(), axis=1)
                       .add_suffix('_ally'))
df.join(dummies)                                             

     country                     allies  USA_ally  China_ally  Singapore_ally
0        USA  Turkey, UK, France, India         0           0               0
1      China            DPRK, Singapore         0           0               1
2  Singapore                 USA, China         1           1               0
在哪里,

dummies

   USA_ally  China_ally  Singapore_ally
0         0           0               0
1         0           0               1
2         1           1               0

让我们尝试一下,使用
series.unique
识别唯一的国家,然后使用
str.contains
检查它是否存在

for c in df.country.unique():
    df[f'{c}_Aally'] = df.allies.str.contains(c).astype(int)
    
df
Out[20]: 
     country                     allies  USA_Aally  China_Aally  Singapore_Aally
0        USA  Turkey, UK, France, India         0           0               0
1      China            DPRK, Singapore         0           0               1
2  Singapore                 USA, China         1           1               0

让我们尝试一下,使用
series.unique
识别唯一的国家,然后使用
str.contains
检查它是否存在

for c in df.country.unique():
    df[f'{c}_Aally'] = df.allies.str.contains(c).astype(int)
    
df
Out[20]: 
     country                     allies  USA_Aally  China_Aally  Singapore_Aally
0        USA  Turkey, UK, France, India         0           0               0
1      China            DPRK, Singapore         0           0               1
2  Singapore                 USA, China         1           1               0

请发布一个示例输入数据框以及此示例数据的预期输出,thanks@stallionic,如果下面的任何帖子回答是您的问题,您可以发布一个示例输入数据框以及此示例数据的预期输出。编辑原始帖子,thanks@stallionic,如果以下任何一个帖子的答案是你的问题,你可以@sushanth谢谢,+1已经是你的问题了,但是尽量避免使用循环解决方案;-)@sushanth谢谢你,+1已经在等你了,但是尽量避免使用循环解决方案;-)@如果这个答案对你有帮助,请把它标记为接受。单击此答案左侧的灰色复选框将其切换为绿色。这表明你成功地得到了这个美好社区的帮助。谢谢。如果这个答案对你有帮助,请把它标为接受。单击此答案左侧的灰色复选框将其切换为绿色。这表明你成功地得到了这个美好社区的帮助。非常感谢。