簡體   English   中英

從 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM