pandas 通过对基于正则表达式选择的列应用条件来创建新列(因为列数是动态的)

tsm1rwdh  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(117)

我有一个 Dataframe ,其中列为first,col1、col2、col3、row1导入panda作为pd

df = pd.DataFrame({'first': ['1', '2', '3', '4', '5', '6', '7', '8'], 'col1': ['yes', 'yes', 'yes', 'yes', 'no', 'no', 'no', 'no'], 'col2': ['yes', 'yes', 'no', 'no' ,'yes', 'yes' ,'no', 'no'], 'col3': ['yes', 'no', 'yes', 'no','yes', 'no','yes', 'no'], 'row1':['4','5','7','3','7','3','79','8']})

第一列1列2列3行1 1是是是4 2是是否5 3是否是7 4是否否3 5否是是7 6否是否3 7否否是79 8否否8
我想应用如下条件并创建一个新列new_one

df.loc[((df['col1']=='no') & (df['col2']=='no') & (df['col3'] == 'no')),'new_one'] = 'no'
df.loc[~((df['col1']=='no') & (df['col2']=='no') & (df['col3'] == 'no')),'new_one'] = 'yes`

**问题:*数据框中的列数是动态的,在上面的数据框中不是常数3,而是与模式匹配,这里是“col

我想根据模式选择列(此处为col*),并对每列应用条件('== 'no'')和'&',然后创建一个新列new_one
我实现了这下面的代码但不工作

col_list=[]
for name in df.columns:
    if(re.search("col",name))
        col_list.append(name)
count=0
cond=''
for col in col_list:
   if(count==0):
      cond+="(df[\'"+col+"\'] == 'no')"
   else:
      cond+="&(df[\'"+col+"\'] == 'no')"
   count=count+1

df.loc[cond,'new_one'] = 'no'
df.loc[~cond,'new_one'] = 'no'

**问题:**cond是一个字符串,我不知道如何使用条件作为df。loc期望cond是series。我也尝试了eval,但是没有成功。请告诉我任何解决方法?

first col1 col2 col3 row1 new_one
1  yes  yes  yes    4     yes
2  yes  yes   no    5     yes
3  yes   no  yes    7     yes
4  yes   no   no    3     yes
5   no  yes  yes    7     yes
6   no  yes   no    3     yes
7   no   no  yes   79     yes
8   no   no   no    8      no
6ie5vjzr

6ie5vjzr1#

这里使用lambda来计算“no”出现的次数。

df['new'] = df[['col1','col2','col3']].T.apply(lambda r: 'no' if list(r).count('no')==3 else 'yes')
35g0bw71

35g0bw712#

使用all/any

df.loc[df[['col1', 'col2', 'col3']].eq('no').all(axis=1), 'new_one'] = 'no'
df.loc[df[['col1', 'col2', 'col3']].ne('no').any(axis=1), 'new_one'] = 'yes'

或者,对于单个命令中的yes/no,numpy.where

df['new_one'] = np.where(df[['col1', 'col2', 'col3']].eq('no').all(axis=1),
                         'no', 'yes')

输出:

first col1 col2 col3 row1 new_one
0     1  yes  yes  yes    4     yes
1     2  yes  yes   no    5     yes
2     3  yes   no  yes    7     yes
3     4  yes   no   no    3     yes
4     5   no  yes  yes    7     yes
5     6   no  yes   no    3     yes
6     7   no   no  yes   79     yes
7     8   no   no   no    8      no
动态列数:
mask = df.filter(like='col').eq('no').all(axis=1)

df['new_one'] = np.where(mask, 'no', 'yes')

相关问题