我有一個資料框,對于列“頁面”,我需要計算唯一元素的數量,直到出現包含子字串“登錄”的元素。如果同一個串列中有多個這樣的元素 - 我需要數到第一個。
輸入示例:
| 地點 | 頁面 |
|---|---|
| 縮放.us | ['zoom.us/register', 'zoom.us/log_in/=?sdsd', 'zoom.us/log_in/=a3344'] |
| 縮放.us | ['zoom.us/about_us'、'zoom.us/error'、'zoom.us/help'、'zoom.us/log_in/jjjsl'、'zoom.us/log_in/llaye'] |
輸出示例:
| 地點 | 頁面 | unique_pages_before_log_in |
|---|---|---|
| 縮放.us | ['zoom.us/register', 'zoom.us/register', 'zoom.us/log_in/=?sdsd', 'zoom.us/log_in/=a3344'] | 1 |
| 縮放.us | ['zoom.us/about_us'、'zoom.us/error'、'zoom.us/help'、'zoom.us/log_in/jjjsl'、'zoom.us/log_in/llaye'] | 3 |
我考慮過使用 set 來計算唯一值,但是直到第一個“登錄”子字串出現之前我才知道如何計算。像這樣的東西:
df['unique_pages_before_login'] = df['pages'].apply(lambda l: len(set(l[:l.index('zoom.us/log_in')])))
我將不勝感激任何幫助:)
uj5u.com熱心網友回復:
看起來你必須在.apply()這里使用。一種方法是將找到的每個元素添加到集合中,直到找到包含搜索字串的元素。當你找到這個時,回傳你創建的集合的大小。
def count_unique_before_login(pages):
c = set()
for item in pages:
if "log_in" in item: return len(c)
c.add(item)
return None # No log_in found
df = {'site': {0: 'zoom.us', 1: 'zoom.us'},
'pages': {0: ['zoom.us/register',
'zoom.us/log_in/=?sdsd',
'zoom.us/log_in/=a3344'],
1: ['zoom.us/about_us',
'zoom.us/error',
'zoom.us/help',
'zoom.us/log_in/jjjsl',
'zoom.us/log_in/llaye']}}
df["unique_pages_before_log_in"] = df["pages"].apply(count_unique_before_login)
這使:
site ... unique_pages_before_log_in
0 zoom.us ... 1
1 zoom.us ... 3
uj5u.com熱心網友回復:
首先,讓我們根據您的需要應用一個函式來查找第一個 log_in。這個函式,應該計算唯一頁面(保持順序),直到我們找到一個登錄實體。
def find_log_in(pages):
# Duplicate removal while preserving order original idea from: https://stackoverflow.com/a/17016257/3281097
# Python 3.7 only
for i, page in enumerate(dict.fromkeys(pages)):
if page.startswith("zoom.us/log_in/"):
return i
return None # -1 or any value that you prefer
現在,您只需將此功能應用于您的列:
df["unique_pages_before_log_in"] = df["pages"].apply(find_log_in)
uj5u.com熱心網友回復:
嘗試:
df["unique_pages_before_log_in"] = df["pages"].apply(lambda x: len(x[:min(i for i, s in enumerate(x) if "log_in" in s)]))
>>> df
site ... unique_pages_before_log_in
0 zoom.us ... 1
1 zoom.us ... 3
[2 rows x 3 columns]
uj5u.com熱心網友回復:
你可以嘗試使用re.findall并for loop得到你想要的。
import re
def find_unique_elements(list_, matchword):
unique_no = []
for row in list_:
for i in range(len(row)):
if matchword in re.findall(matchword,str(row[i])):
unique_no.append(i)
break
return unique_no
matchword = "log_in"
list_ = df["pages"]
ddf = find_unique_elements(list_,matchword)
df["unique_pages_before_log_in"] = ddf
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/434724.html
