7

私は R ユーザーですが、pandas で match() に相当するものを理解できません。この関数を使用して、一連のファイルを反復処理し、重要な情報を取得して、それを「url」の現在のデータ構造にマージする必要があります。Rでは、次のようにします。

logActions <- read.csv("data/logactions.csv")
logActions$class <- NA

files = dir("data/textContentClassified/")
for( i in 1:length(files)){
    tmp <- read.csv(files[i])
    logActions$class[match(logActions$url, tmp$url)] <- 
            tmp$class[match(tmp$url, logActions$url)]
}

それぞれが毎回logActions $ classを上書きするため、merge()またはjoin()を使用できるとは思いません。どちらも必要なインデックス作成機能を持っていないため、 update() も Combine_first() も使用できません。また、この SO 投稿に基づいて match() 関数を作成しようとしましたが、DataFrame オブジェクトで動作させる方法がわかりません。明らかな何かが欠けている場合はお詫び申し上げます。

これは、パンダで match() のようなことをしようとする私の効果のない試みをまとめた python コードです。

from pandas import *
left = DataFrame({'url': ['foo.com', 'foo.com', 'bar.com'], 'action': [0, 1, 0]})
left["class"] = NaN
right1 = DataFrame({'url': ['foo.com'], 'class': [0]})
right2 = DataFrame({'url': ['bar.com'], 'class': [ 1]})

# Doesn't work:
left.join(right1, on='url')
merge(left, right, on='url')

# Also doesn't work the way I need it to:
left = left.combine_first(right1)
left = left.combine_first(right2)
left 

# Also does something funky and doesn't really work the way match() does:
left = left.set_index('url', drop=False)
right1 = right1.set_index('url', drop=False)
right2 = right2.set_index('url', drop=False)

left = left.combine_first(right1)
left = left.combine_first(right2)
left

望ましい出力は次のとおりです。

    url  action  class
0   foo.com  0   0
1   foo.com  1   0
2   bar.com  0   1

しかし、各ファイルを反復できるように、これを何度も呼び出すことができる必要があります。

4

3 に答える 3

1

編集

すべての右側のデータフレームの URL が一意である場合、右側のデータフレームをclassによってインデックス付けされたシリーズとして作成urlできます。次に、左側のすべての URL のクラスをインデックス付けして取得できます。

from pandas import *
left = DataFrame({'url': ['foo.com', 'bar.com', 'foo.com', 'tmp', 'foo.com'], 'action': [0, 1, 0, 2, 4]})
left["klass"] = NaN
right1 = DataFrame({'url': ['foo.com', 'tmp'], 'klass': [10, 20]})
right2 = DataFrame({'url': ['bar.com'], 'klass': [30]})

left["klass"] = left.klass.combine_first(right1.set_index('url').klass[left.url].reset_index(drop=True))
left["klass"] = left.klass.combine_first(right2.set_index('url').klass[left.url].reset_index(drop=True))

print left

これは、あなたの望むことですか?

import pandas as pd
left = pd.DataFrame({'url': ['foo.com', 'foo.com', 'bar.com'], 'action': [0, 1, 0]})
left["class"] = NaN
right1 = pd.DataFrame({'url': ['foo.com'], 'class': [0]})
right2 = pd.DataFrame({'url': ['bar.com'], 'class': [ 1]})

pd.merge(left.drop("class", axis=1), pd.concat([right1, right2]), on="url")

出力:

   action      url  class
0       0  foo.com      0
1       1  foo.com      0
2       0  bar.com      1

左のクラス列がすべて NaN でない場合は、それを結果と結合することができます。

于 2013-04-06T22:36:59.913 に答える