为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2023-06-20 14:10:35
尝试使用 pandas 遍历每一行,评估该行的 B 列值是否包含 A 列中的任何值,然后填充与 A 行中的每个值对应的新列 C、D、E ...。代码下面是我为获得相同结果而必须做的事情,但在这里我需要事先知道 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)
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

您可以使用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


查看完整回答
反对 回复 2023-06-20
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

让我们试试这个,用它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


查看完整回答
反对 回复 2023-06-20
?
慕沐林林

TA贡献2016条经验 获得超9个赞

这是您的代码的概括,首先获取列中出现的所有唯一字母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))

请注意,我已将条件简化1 if A in x else 0为 just int(l in x),因为int(True) == 1无论如何int(False) == 0。


查看完整回答
反对 回复 2023-06-20
  • 3 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信