Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于多个其他列中字符串的一部分创建列_Python_String_Pandas - Fatal编程技术网

Python 基于多个其他列中字符串的一部分创建列

Python 基于多个其他列中字符串的一部分创建列,python,string,pandas,Python,String,Pandas,我有一个名为df的数据框架,看起来与此类似(除了“mat_deliver”列的数量增加到mat_deliver_8,并且有数百个客户端-我在这里对其进行了简化) 我想创建一个名为xxx\u deliver的新列,其中包含两个值,0和1。如果mat\u-deliver\u 1、mat\u-deliver\u 2、mat\u-deliver\u 3或mat\u-deliver\u 4中的任何一个包含xxx,如果不包含0,我想将xxx\u-deliver\code>设置为等于1 因此,我想添加一列,以

我有一个名为
df
的数据框架,看起来与此类似(除了“mat_deliver”列的数量增加到mat_deliver_8,并且有数百个客户端-我在这里对其进行了简化)

我想创建一个名为
xxx\u deliver
的新列,其中包含两个值,
0
1
。如果
mat\u-deliver\u 1
mat\u-deliver\u 2
mat\u-deliver\u 3
mat\u-deliver\u 4
中的任何一个包含
xxx
,如果不包含
0
,我想将
xxx\u-deliver\code>设置为等于
1

因此,我想添加一列,以
df
为例,如下所示:

Client_ID  mat_deliv_1  mat_deliv_2  mat_deliv_3  mat_deliv_4  xxx_deliv
C1019876   xxx,yyy,zzz  aaa,bbb,xxx  ccc          ddd          1
C1018765   yyy,zzz      xxx          bbb          None         1
C1017654   yyy,xxx      aaa,bbb      ccc          ddd          1
C1016543   aaa,bbb      ccc          None         None         0
C1019876   yyy          None         None         None         0
我知道以下代码执行所需的任务:

df['xxx_deliv'] = 0
df.loc[(df.Mat_deliv_1.str.contains("xxx", na=False)) |
       (df.Mat_deliv_2.str.contains("xxx", na=False)) |
       (df.Mat_deliv_3.str.contains("xxx", na=False)) |
       (df.Mat_deliv_4.str.contains("xxx", na=False)),
       'xxx_deliv'] = 1
但我希望能够做到这一点,而无需查看每一列-我需要能够同时搜索多个列。

您可以使用:

输出

  Client_ID  mat_deliv_1    ...    mat_deliv_4 xxx_deliv
0  C1019876  xxx,yyy,zzz    ...            ddd         1
1  C1018765      yyy,zzz    ...           None         1
2  C1017654      yyy,xxx    ...            ddd         1
3  C1016543      aaa,bbb    ...           None         0
4  C1019876          yyy    ...           None         0

[5 rows x 6 columns]

您需要单独检查每一列。您可以通过
apply
检查字符串是否包含目标文本来执行此操作。然后对行应用
any
(通过指定
axis=1
)。通过
.astype(int)
将布尔结果转换为整数,然后使用
assign
将其作为新列添加到数据帧中

我使用
loc[:,target\u cols]
将我的搜索范围指定为数据帧中的所有行和所有选择的
target\u cols

target_cols = ['mat_deliv_1', 'mat_deliv_2', 'mat_deliv_3', 'mat_deliv_4']
df = (df
      .assign(xxx_deliv=df.loc[:, target_cols].apply(lambda col: col.str.contains('xxx'))
      .any(axis=1)
      .astype(int))
>>> df
  Client_ID  mat_deliv_1  mat_deliv_2 mat_deliv_3 mat_deliv_4  xxx_deliv
0  C1019876  xxx,yyy,zzz  aaa,bbb,xxx         ccc         ddd          1
1  C1018765      yyy,zzz          xxx         bbb        None          1
2  C1017654      yyy,xxx      aaa,bbb         ccc         ddd          1
3  C1016543      aaa,bbb          ccc        None        None          0
4  C1019876          yyy         None        None        None          0

谢谢你,亚历山大。我做了一次编辑,将iloc替换为loc,因为我在
Client\u ID
mat\u deliver\u 1
之间有许多列,这个数字可能会改变;通过标签而不是位置进行修复意味着我将来不必更改脚本:
df=df.assign(xxx_deliver=df.loc[:,“mat_deliver_1”:“mat_deliver_4”]。apply(lambda col:col.str.contains('xxx')。any(axis=1)。astype(int))
我必须了解更多关于
lambda
,我到处都能看到它@FGreen见上面编辑的答案。我添加了一个列表容器,用于保存您想要检查内容的目标列。谢谢@Alexander-快速跟进问题:如果我想让
xxx\u deliver
列计算四列
mat\u deliver
中发生的次数,我将如何调整它(例如,第0行中的
2
,第1行中的
1
)而不仅仅是表示缺席/在场的二进制0/1值?@FGreen您应该将后续问题作为新问题提问(提供原始问题的链接以提供上下文)。在这种情况下,您可以尝试
.apply(lambda col:col.str.count('xxx')).sum(axis=1)
此处提出的新问题:[谢谢Alexander。
  Client_ID  mat_deliv_1    ...    mat_deliv_4 xxx_deliv
0  C1019876  xxx,yyy,zzz    ...            ddd         1
1  C1018765      yyy,zzz    ...           None         1
2  C1017654      yyy,xxx    ...            ddd         1
3  C1016543      aaa,bbb    ...           None         0
4  C1019876          yyy    ...           None         0

[5 rows x 6 columns]
target_cols = ['mat_deliv_1', 'mat_deliv_2', 'mat_deliv_3', 'mat_deliv_4']
df = (df
      .assign(xxx_deliv=df.loc[:, target_cols].apply(lambda col: col.str.contains('xxx'))
      .any(axis=1)
      .astype(int))
>>> df
  Client_ID  mat_deliv_1  mat_deliv_2 mat_deliv_3 mat_deliv_4  xxx_deliv
0  C1019876  xxx,yyy,zzz  aaa,bbb,xxx         ccc         ddd          1
1  C1018765      yyy,zzz          xxx         bbb        None          1
2  C1017654      yyy,xxx      aaa,bbb         ccc         ddd          1
3  C1016543      aaa,bbb          ccc        None        None          0
4  C1019876          yyy         None        None        None          0