基于其他列的值创建新列的更好方法

2024-04-20 07:25:37 发布

您现在位置:Python中文网/ 问答频道 /正文

创建下面提到的同一列的更好方法是什么:

col_new = []
for r1 in df['col_A']:
    if r1==1:
        for r2 in df['col_B']:
            if r2!='None':
                col_new.append('col_new')

df['col_new'] = col_new

我的数据帧很大(120k*22),运行上面的代码就是挂在笔记本上。有没有一种更快更有效的方法来创建这个列,当col\u a为1时,它表示col\u B的所有非空值


Tags: 数据方法代码innonedfnewfor
1条回答
网友
1楼 · 发布于 2024-04-20 07:25:37

我认为需要创建布尔掩码,然后通过^{}附加值:

mask = (df['col_A'] == 1) & (df['col_B']!='None')

#if None is not string
#mask = (df['col_A'] == 1) & (df['col_B'].notnull())
df.loc[mask, 'col_new'] = 'col_new'

样本

列中是字符串None

df = pd.DataFrame({
    'col_A': [1,1,2,1],
    'col_B': ['a','None','None','a']
})
print (df)
   col_A col_B
0      1     a
1      1  None
2      2  None
3      1     a

mask = (df['col_A'] == 1) & (df['col_B']!='None')
df.loc[mask, 'col_new'] = 'val'
print (df)
   col_A col_B col_new
0      1     a     val
1      1  None     NaN
2      2  None     NaN
3      1     a     val

列中有not strings ^{}s,然后使用^{}

df = pd.DataFrame({
    'col_A': [1,1,2,1],
    'col_B': ['a',None,None,'a']
})
print (df)
   col_A col_B
0      1     a
1      1  None
2      2  None
3      1     a

mask = (df['col_A'] == 1) & (df['col_B'].notna())
#oldier pandas versions
#mask = (df['col_A'] == 1) & (df['col_B'].notnull())
df.loc[mask, 'col_new'] = 'val'
print (df)
   col_A col_B col_new
0      1     a     val
1      1  None     NaN
2      2  None     NaN
3      1     a     val

另外,如果想使用if-else语句^{}真的很有用:

df['col_new'] = np.where(mask, 'val', 'another_val')
print (df)
   col_A col_B      col_new
0      1     a          val
1      1  None  another_val
2      2  None  another_val
3      1     a          val

相关问题 更多 >