我有一个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
请提前帮助,谢谢!
答案 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.select
或np.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
<强>买者强>:
性能实际上取决于数据。