2015-02-23 61 views
0

我從用戶提交的表單中獲取包含大量行的CSV。每一行都包含一個用戶電子郵件和一個字段,供他們在其組中列出其他用戶電子郵件。到目前爲止,我已經使用Python和熊貓編寫了一個簡短的腳本,將CSV加載到數據框中並清理條目。根據共享值對行進行分組

我想分組排序的行,但我遇到了一些概念問題。由於它是用戶輸入的,因此列表不一定是完整的或拼寫正確的。處理這個問題的最好方法是什麼?我完全不熟悉解析這樣的數據,而是總體上缺乏經驗。

下面是一些例子的數據顯示我的意思:

email,group 
[email protected], "['[email protected]','[email protected]']" 
[email protected], 
[email protected], "['[email protected]']" 
[email protected], "['[email protected]','[email protected]']" 

所以在這裏用戶1,用戶3,和USER4是在一組。問題是user3只列出了user1。

我的第一個想法是將提交用戶的電子郵件追加到組列表中,然後按字母順序對列表和列進行排序。但是,只有在每個人的組條目都完整的情況下才有效。

我不想親手挑選200個小組,但是我失去了如何繼續。 這是我目前的計劃在僞代碼:

data # dataframe containing imported CSV 
sorted_groups # result dataframe with equivalent rows, but sorted into groups 
sort(data) by len(data[group]) 
for each row in data: 
    append row to sorted_groups 
    search for rows where email == entry in groups 
    append matching rows to sorted_groups 
    remove matching rows from data 
    remove initial row from data 

這必將對拼寫錯誤失敗,如果至少有一個人的組中得到的一切權利纔有效。不過,這是目前我擁有的最好的。

感謝您花時間閱讀本文。請讓我知道,如果我能澄清任何事情,並指出我在正確的方向!

回答

1

我不確定你的數據是如何存儲的,所以我假設你有一行數據列表,並且每行都包含了表單中輸入的所有電子郵件地址。例如,

rows = [['[email protected]','[email protected]','[email protected]'], 
     ['[email protected]'], 
     ['[email protected]', '[email protected]'], 
     ['[email protected]','[email protected]','[email protected]']] 

我也假設每個用戶屬於一個且只有一個組,每個用戶已經提交表單,並且每個用戶沒有拼錯他們的電子郵件。

我們可以通過

valid = {row[0] for row in rows} 

我們可以建立一個字典映射用戶組獲得一組有效的電子郵件地址,合併組,因爲我們去,並刪除無效的電子郵件。

ugDict = {} 

for row in rows: 
    mergedGroup = set(row) & valid 
    for user in row: 
    if user in ugDict: 
     mergedGroup |= ugDict[user] 
    for user in mergedGroup: 
    ugDict[user] = mergedGroup 

這將導致從用戶到組的映射,並且將包括任何錯誤輸入的電子郵件地址。您必須決定如何驗證電子郵件 - 您可能只是想忽略它們。

現在,要獲取組的排序列表,請創建一組所有組,並使用排序的函數。 (g)使python的set對象可排序(即可排序)。

結果呢?

sortedGroups = [frozenset({'[email protected]'}), 
       frozenset({'[email protected]', '[email protected]', '[email protected]'})] 
+0

謝謝,我認爲字典一定會有幫助。 – Wieschie 2015-02-24 00:11:47

+0

對不起,我的編輯被時間限制吃掉了。 關於拼寫錯誤,我可以安全地假設他們自己的電子郵件是正確的。因此,通過此代碼,每行中的第一個用戶將成爲條目的關鍵字,是否正確?在這種情況下,如果用戶自己的電子郵件是該行中的第一個,則所有條目都應該是有效的。 (如果情況並非如此,它不會是世界末日)。 我也有其他數據與每個用戶關聯。處理這個問題的最好方法是將它們分組,然後將這些信息添加回其餘的數據。 – Wieschie 2015-02-24 00:18:08

+1

使用此代碼,每封電子郵件都會在字典中獲取條目,指向它所屬的組,而不管它們是否是輸入該行的用戶。 – levis501 2015-02-24 00:30:55

相關問題