如何使用掩码合并列

时间:2018-02-24 22:39:08

标签: pandas merge mask

我正在尝试合并两列(电话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' : [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,但我无法弄清楚。谢谢。

1 个答案:

答案 0 :(得分:1)

首先,填写NaNs开始;

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合并奇数/偶数索引上的列:

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