如何在pandas数据帧的列中拆分和分类值

时间:2018-01-22 11:21:57

标签: python pandas dataframe data-analysis

我有一个df,

    keys
0   one
1   two,one
2   " "
3   five,one
4   " "
5   two,four
6   four
7   four,five

和两个清单,

 actual=["one","two"]
 syn=["four","five"]

我正在创建一个新行df [“val”] 我正在试图获取df["keys"]中的单元格类别。如果actual中存在任何密钥,那么我想在新列中添加实际但是同一行,如果实际中没有任何值,那么我想要相应的df["val"] as syn。它不应该对白色空间单元做任何事情。

我想要的输出是,

output_df

    keys      val
0   one       actual
1   two,one   actual
2   " "        
3   five,one  actual
4   " "
5   two,four  actual
6   four      syn
7   four,five syn

请提前帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

首先,在逗号上拆分并将单词扩展到自己的单元格中。

v = df['keys'].str.split(',',expand=True)

接下来,使用actual + syn形成两个面具,一个用于isin,另一个用于any。这些将用于标记行。

m1 = v.isin(["one","two"]).any(1)
m2 = v.isin(["four","five"]).any(1)

最后,使用np.selectnp.where根据计算的掩码标记行。

df['val'] = np.select([m1, m2], ['actual', 'syn'], default='')

或者,

df['val'] = np.where(m1, 'actual', np.where(m2, 'syn', ''))

df

        keys     val
0        one  actual
1    two,one  actual
2                   
3   five,one  actual
4                   
5   two,four  actual
6       four     syn
7  four,five     syn

<强>详情

v

      0     1
0   one  None
1   two   one
2        None
3  five   one
4        None
5   two  four
6  four  None
7  four  five

m1

0     True
1     True
2    False
3     True
4    False
5     True
6    False
7    False
dtype: bool

m2

0    False
1    False
2    False
3     True
4    False
5     True
6     True
7     True
dtype: bool

np.select([m1, m2], ['actual', 'syn'], default='')
array(['actual', 'actual', '', 'actual', '', 'actual', 'syn', 'syn'],
      dtype='<U6')

答案 1 :(得分:1)

通过比较set s:

,使用numpy.select双重条件来检查成员资格
s = df['keys'].str.split(',')
m1 = s.apply(set) & set(actual)
m2 = s.apply(set) & set(syn)

df['part'] = np.select([m1, m2], ['actual','syn'], default='')
print (df)
        keys    part
0        one  actual
1    two,one  actual
2                   
3   five,one  actual
4                   
5   two,four  actual
6       four     syn
7  four,five     syn

<强>计时

df = pd.concat([df] * 10000, ignore_index=True)


In [143]: %%timeit 
     ...: s = df['keys'].str.split(',')
     ...: m1 = s.apply(set) & set(actual)
     ...: m2 = s.apply(set) & set(syn)
     ...: 
1 loop, best of 3: 160 ms per loop

#cᴏʟᴅsᴘᴇᴇᴅ' s solution
In [144]: %%timeit
     ...: v = df['keys'].str.split(',',expand=True)
     ...: m1 = v.isin(["one","two"]).any(1)
     ...: m2 = v.isin(["four","five"]).any(1)
     ...: 
1 loop, best of 3: 193 ms per loop

<强>买者

性能实际上取决于数据。