让我们考虑这个数据框:temp = pd.DataFrame({'x': [['ab', 'bc'], ['hg'], np.nan]})temp x0 [ab, bc]1 [hg]2 NaNI 想创建一个名为 dummy 的新列,它采用以下值……
让我们考虑这个数据框:
temp = pd.DataFrame({'x': [['ab', 'bc'], ['hg'], np.nan]})
temp
x
0 [ab, bc]
1 [hg]
2 NaN
我想创建一个名为 的新列, dummy
如果某行在其任何元素中包含字母“a”,则取值为 1;如果不包含字母“a”,则取值为 0;如果为 NaN,则取值为 NaN。
预期结果:
x dummy
0 [ab, bc] 1
1 [hg] 0
2 NaN NaN
听起来很简单,但我被难住了。我尝试过:
1)
temp['dummy'] = np.where(temp.x.str.contains('a', case = False, na = False), 1, 0)
将分配所有 0,因为它将整个列表与 'a' 进行比较
2)
temp['dummy'] = np.where(temp.x.astype(str).str.contains('a', case = False, na = False), 1, 0)
atype(str)
将通过将列表展平为字符串来解决上述问题,但现在 np.NaN 是“nan”并且 na = False
不起作用。
3)
temp['dummy'] = np.where(all([temp.x.astype(str).str.contains('a', case = False, na = False) , temp.x.astype(str) != 'nan']), 1, 0)
我认为我的第二个条件应该解决上述问题,但现在我收到错误: ValueError: The truth value of a Series is ambiguous.
4)
temp['dummy'] = [1 if all(['a' in y , y != np.nan]) else 0 for y in temp.x ]
错误: TypeError: argument of type 'float' is not iterable
5)
唯一可行的方法是:
temp['dummy'] = np.nan # placeholder
temp['dummy'][temp.x.notnull()] = np.where(temp[temp.x.notnull()].x.astype(str).str.contains('a', case = False, na = False), 1, 0)
temp
但它只有两条线,而且很丑。