如何使用掩码合并列

How to merge columns using mask

我正在尝试合并两列(Phone 1 和 2)

这是我的假数据:

import pandas as pd
employee = {'EmployeeID' : [0, 1, 2, 3, 4, 5, 6, 7],
         'LastName' : ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
         'Name' : ['w', 'x', 'y', 'z', None, None, None, None],
         'phone1' : [1, 1, 2, 2, 4, 5, 6, 6],
         'phone2' : [None, None, 3, 3, None, None, 7, 7],
         'level_15' : [0, 1, 0, 1, 0, 0, 0, 1]}

df2 = pd.DataFrame(employee)

我希望 'phone' 列为

'phone' : [1, 2, 3, 4, 5, 7, 9, 10]

在我的代码开头,我根据“/”拆分了名称,下面的这段代码创建了一个包含 0 和 1 的列,我将其用作掩码以在整个代码中执行其他任务。

df2 = (df2.set_index(cols)['name'].str.split('/',expand=True).stack().reset_index(name='Name'))

m = df2['level_15'].eq(0)
print (m)

#remove column level_15
df2 = df2.drop(['level_15'], axis=1)

#add last name for select first letter by condition, replace NaNs by forward fill
df2['last_name'] = df2['name'].str[:2].where(m).ffill()

df2['name'] = df2['name'].mask(m, df2['name'].str[2:])

我觉得有一种方法可以使用 0 和 1 合并 phone1 和 phone2,但我想不通。谢谢。

首先,从填写 NaN 开始;

df2['phone2'] = df2.phone2.fillna(df2.phone1)

# Alternatively, based on your latest update
# df2['phone2'] = df2.phone2.mask(df2.phone2.eq(0)).fillna(df2.phone1)

您可以只使用 np.where 合并 odd/even 索引上的列:

df2['phone'] = np.where(np.arange(len(df2)) % 2 == 0, df2.phone1, df2.phone2)
df2 = df2.drop(['phone1', 'phone2'], 1)

df2

   EmployeeID LastName  Name  phone
0           0        a     w      1
1           1        b     x      2
2           2        c     y      3
3           3        d     z      4
4           4        e  None      5
5           5        f  None      6
6           6        g  None      7
7           7        h  None      8

或者,Series.where/mask:

df2['phone'] = df2.pop('phone1').where(
         np.arange(len(df2)) % 2 == 0, df2.pop('phone2')
)

或者,

df2['phone'] = df2.pop('phone1').mask(
         np.arange(len(df2)) % 2 != 0, df2.pop('phone2)
)

df2

   EmployeeID LastName  Name  phone
0           0        a     w      1
1           1        b     x      2
2           2        c     y      3
3           3        d     z      4
4           4        e  None      5
5           5        f  None      6
6           6        g  None      7
7           7        h  None      8