def comp():
for car in df.name:
x=car.split(' ')
return x[0]
df.car=comp()
我想从“名称”列中提取汽车的品牌,然后使用它来进行另一列“汽车”的分析,但是此代码似乎不起作用,整个汽车列都填充了相同的值。
基本问题是您的return语句在循环内,因此将返回第一次迭代的结果。这与您将单个常量值分配回整个列的事实结合在一起,导致该值在所有行中广播,这就是为什么您看到所有具有相同值的原因。我建议做的是创建一个对单个值进行操作的函数(例如,您遍历一个名称列表,然后将您的逻辑应用于单个值),然后在循环或列表理解内调用此函数以最终建立完整的专栏。
def try_split(val):
try:
return val.split()[0]
except AttributeError:
return np.nan
df = pd.DataFrame({'name': ['aaa bb', 'ccc', 'ddd ee ff', np.nan]})
df
name
0 aaa bb
1 ccc
2 ddd ee ff
3 NaN
df['car'] = [try_split(val) for val in df['name']]
df
name car
0 aaa bb aaa
1 ccc ccc
2 ddd ee ff ddd
3 NaN NaN
这是一个列表理解,是完成它的一种不错的方法。它不比熊猫方法慢(请参见下文),并且具有高度的灵活性,并可以控制功能和错误处理。我在这篇文章中写了更多关于列表推导的用法:熊猫中的for循环真的不好吗?我什么时候应该在意?
但是,这是一种更通用的处理方式:用分隔空格,str.split
并使用使用第一个单词str[0]
:
# str.split() splits on whitespace by default
df['car'] = df['name'].str.split().str[0]
df
name car
0 aaa bb aaa
1 ccc ccc
2 ddd ee ff ddd
3 NaN NaN
这与上面的循环相比没有更多的向量化,但是肯定在函数调用后隐藏了许多复杂性和角落套框逻辑,并且可读性更高。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句