Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Pandas_Dataframe_Jupyter Notebook - Fatal编程技术网

比较列中的字符串并在python中创建新列

比较列中的字符串并在python中创建新列,python,python-3.x,pandas,dataframe,jupyter-notebook,Python,Python 3.x,Pandas,Dataframe,Jupyter Notebook,我有如下所示的数据帧。我需要将数据框中的列与字符串进行比较,并创建一个新列 数据帧: col_1 AB_SUMI AK_SUMI SB_LIMA SB_SUMI XY_SUMI 如果“AB”、“AK”和“SB”出现在第1列中,则应使用各自的值创建一个新列,否则列值中应出现“*” 预期产出: col_1 new_col AB_SUMI AB AK_SUMI AK SB_LIMA SB SB_SUMI SB XY_SUMI * 我试过下面的代码,

我有如下所示的数据帧。我需要将数据框中的列与字符串进行比较,并创建一个新列

数据帧:

col_1
AB_SUMI
AK_SUMI
SB_LIMA
SB_SUMI
XY_SUMI
如果“AB”、“AK”和“SB”出现在第1列中,则应使用各自的值创建一个新列,否则列值中应出现“*”

预期产出:

col_1      new_col
AB_SUMI     AB
AK_SUMI     AK
SB_LIMA     SB
SB_SUMI     SB
XY_SUMI     *
我试过下面的代码,但没有成功

list=['AB','AK','AB']

for item in list:
    if df['col1'].str.contains(item).any():
        df['new']=item
请在这方面帮助我。提前感谢

您可以使用
regex
创建的
列表
通过
加入
|
),最后将
NaN
替换为:

有趣的方法

L = 'AB AK SB'.split()

c = df.col_1.values.astype(str)
f = lambda x, s : np.core.defchararray.find(x, s) >= 0
df.assign(new=np.stack([f(c, i) for i in L]).astype(object).T.dot(np.reshape(L, (-1, 1)))).replace('', '*')

     col_1 new
0  AB_SUMI  AB
1  AK_SUMI  AK
2  SB_LIMA  SB
3  SB_SUMI  SB
4  XY_SUMI   *

太有创意了!还有一个疑问,如果我想在所有条件下更改新的列值,保持不变,我应该在上面的代码中做什么更改?我不确定是否理解-什么条件?你能解释更多吗?我想更改新的col值和预期输出。我该怎么做?你觉得现有的专栏怎么样?然后使用与答案
df['col_1']=df.col_1.str.extract(a,expand=False)相同的方法。fillna('*')
L = 'AB AK SB'.split()

c = df.col_1.values.astype(str)
f = lambda x, s : np.core.defchararray.find(x, s) >= 0
df.assign(new=np.stack([f(c, i) for i in L]).astype(object).T.dot(np.reshape(L, (-1, 1)))).replace('', '*')

     col_1 new
0  AB_SUMI  AB
1  AK_SUMI  AK
2  SB_LIMA  SB
3  SB_SUMI  SB
4  XY_SUMI   *