[英]How does one extract numbers from a string in a dataframe and add the multiple of these numbers in a new column of the same dataframe
[英]Extract a string from a column of a dataframe and add a new column using that string
def comp():
for car in df.name:
x=car.split(' ')
return x[0]
df.car=comp()
我想從“名稱”列中提取汽車的品牌並制作另一列-“汽車”使用它進行一些分析,但這段代碼似乎不起作用,整個汽車列都填充了相同的值。
根本問題是您的 return 語句在循環內,因此返回第一次迭代的結果。 這與您將單個常量值分配回整個列的事實相結合,導致該值在所有行中廣播,這就是為什么您看到它們都具有相同值的原因。 我建議做的是創建一個 function 對單個值進行操作(想想你迭代一個名稱列表,然后將你的邏輯應用於單個值),然后你在循環或列表理解中調用這個 function 最終構建完整的列。
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
這是一個列表理解,是完成它的一種非常好的方法。 它並不比 pandaic 方法慢(見下文),並且提供了很好的靈活性和對 function 和錯誤處理的控制。 我在這篇文章中寫了更多關於列表推導的使用: pandas 中的 for-loops 真的很糟糕嗎? 我什么時候應該關心?
然而,這里有一種更流行的做事方式:使用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
這並不比上面的循環更矢量化,但絕對隱藏了 function 調用背后的許多復雜性和拐角大小寫邏輯,並且更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.