2017-09-13 3 views
0

私はsklearn.datasets.fetch_20newsgroups()データセットを使用しています。ここでは、複数のニュースグループに属するいくつかのドキュメントがあります。私はそれらの文書を、それぞれが1つのニュースグループに属する2つの異なるエンティティとして扱いたいと思います。これを行うために、私は文書IDとグループ名をデータフレームに持ってきました。パンダ - 別の列との関係に基づいて列の値を変更します。

import sklearn 
from sklearn import datasets 
data = datasets.fetch_20newsgroups() 

filepaths = data.filenames.astype(str) 
keys = [] 
for path in filepaths: 
    keys.append(os.path.split(path)[1]) 

groups = pd.DataFrame(keys, columns = ['Document_ID']) 
groups['Group'] = data.target 
groups.head() 

>> Document_ID Group 
0 102994  7 
1 51861  4 
2 51879  4 
3 38242  1 
4 60880  14 

print (len(groups)) 
>>11314 
print (len(groups['Document_ID'].drop_duplicates())) 
>>9840 
print (len(groups['Group'].drop_duplicates())) 
>>20 

各Document_IDについて、複数のグループ番号が割り当てられている場合は、その値を変更したいと考えています。例では、私はこれがなりたい

groups[groups['Document_ID']=='76139'] 

>> Document_ID Group 
5392 76139 6 
5680 76139 17 

ここ
>> Document_ID Group 
5392 76139 6 
5680 12345 17 

、12345はkeysリストにないランダムな新しいIDです。

どうすればいいですか?

答えて

1

Document_IDの最初の部分には、duplicatedのメドコードを含むすべての行が見つかります。次に、新しいIDのリストから、最大ID以上のIDの1つを作成します。 locインデックス演算子を使用して、重複するキーを新しいIDで上書きします。

groups.loc[[5392,5680]] 

     Document_ID Group 
5392  76139  6 
5680  179489  17 

groups['Document_ID'] = groups['Document_ID'].astype(int) 
dupes = groups.Document_ID.duplicated(keep='first') 
max_id = groups.Document_ID.max() + 1 
new_id = range(max_id, max_id + dupes.sum()) 
groups.loc[dupes, 'Document_ID'] = new_id 

テストケースには重複が残っていないことを確認してください。

groups.Document_ID.duplicated(keep='first').any() 
False 
0

Kinda Hacky、なぜそうではありませんか!助け

data = {"Document_ID": [102994,51861,51879,38242,60880,76139,76139], 
    "Group": [7,1,3,4,4,6,17], 
    } 
groups = pd.DataFrame(data) 

groupDict ={} 
tempLst=[] 

#Create a list of unique ID's 
DocList = groups['Document_ID'].unique() 
DocList.tolist() 

#Build a dictionary and push all group ids to the correct doc id 
DocDict = {} 
for x in DocList: 
    DocDict[x] = [] 

for index, row in groups.iterrows(): 
    DocDict[row['Document_ID']].append(row['Group']) 
#For all doc Id's with multip entries create a new id with the group id as a decimal point. 
groups['DupID'] = groups['Document_ID'].apply(lambda x: len(DocDict[x])) 
groups["Document_ID"] = np.where(groups['DupID'] > 1, groups["Document_ID"] + groups["Group"]/10,groups["Document_ID"]) 

希望...

関連する問題