簡體   English   中英

迭代數據框列以在字符串中查找匹配項的最快方法

[英]Fastest Way to Iterate Over Dataframe Column to Find Match in Strings

這是來自大型數據幀的非常截斷的摘錄:

姓名 年齡 城市
66 紐約
45 倫敦
詹姆士 22 洛杉磯

我還有許多字符串,每個字符串都包含不同的單詞,但會包含 name 列中的一個(不是更多)值。

例如:

  1. “羅伯出生在倫敦”
  2. “本曾經住在紐約”

對於每個字符串,我想遍歷“名稱”列以查找與字符串中的名稱匹配的名稱並返回該人的年齡。

所以在第一個例子中,期望的結果是 45,而在第二個例子中,期望的結果是 66。

我是 Pandas 的新手,正在苦苦掙扎。 誰能指出我正確的方向?

希望這可以幫助:

所有字符串的列表。 這可以是另一個數據框的一部分。 只需選擇此值所在的列並將其轉換為列表。

l = ['rob was born in London', "ben once lived in New York"]

您示例中的數據框

df = pd.DataFrame({'name': ['ben', 'rob', 'james'],
                    'age': [66, 45, 22],
                    'city': ['NY', 'LON', 'LA']})

存在stringage的最終數據集。

age_dat = pd.DataFrame()

第一個 for 循環遍歷原始 ( df ) 數據集中的名稱。 第二個 for 循環遍歷sentences列表(列表l )。 如果在l中找到任何名稱,則將其附加到age_dat中。

for x in list(df.name):
   
    for z in l:
        if x in z:
            dat = pd.DataFrame()
            dat['string']=[z]
            dat['age'] = [df[df['name']==x].age.tolist()[0]]
       
            age_dat = age_dat.append(dat)

print(age_dat)



                          string  age
0  ben once lived in New York   66
0      rob was born in London   45

數據

s = pd.Series(['rob was born in London', "ben once lived in New York"])
df = pd.DataFrame({'name': ['ben', 'rob', 'james'],
                    'age': [66, 45, 22],
                    'city': ['NY', 'LON', 'LA']})

解決方案

who = s.str.extract('(' + ')|('.join(df.name) + ')').bfill(axis=1)[0]
age_by_name = dict(zip(df.name, df.age))
pd.DataFrame({'text': s, 'age': who.map(age_by_name)})


                      text  age
0   rob was born in London  45
1   ben once lived in New York  66

解釋

使用.str.extract獲取字符串中的名稱,然后將其與數據框匹配以獲取年齡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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