私は数千のオンライン記事のURLを含む「リンク」列のデータフレームを持っています。各観測にはURLが1つあります。一致する行に辞書キーを割り当てながら、辞書値を使ってデータフレームをフィルタリングしますか?
urls_list = ['http://www.ajc.com/news/world/atlan...',
'http://www.seattletimes.com/sports/...',
'https://www.cjr.org/q_and_a/washing...',
'https://www.washingtonpost.com/grap...',
'https://www.nytimes.com/2017/09/01/...',
'http://www.oregonlive.com/silicon-f...']
df = pd.DataFrame(urls_list,columns=['Links'])
私はさらにパブリケーション名キーとドメイン名の値としてとしてが含まれている辞書を持っています。
私は同時にで がに辞書のキーにパブリケーション名を割り当てながら「リンク」列には、辞書の値にドメインが含まれているもののみの観測を取得するためにデータフレームをフィルタリングしたいurls_dict = dict({'Atlanta Journal-Constitution':'ajc.com',
'The Washington Post':'washingtonpost.com',
'The New York Times':'nytimes.com'})
新しい列「出版物」。私が思ったのは、以下のコードを使って 'Publication'カラムを作成し、そのカラムからNone
を落として、事実の後にデータフレームをフィルタリングすることです。
pub_list = []
for row in df['Links']:
for k,v in urls_dict.items():
if row.find(v) > -1:
publication = k
else:
publication = None
pub_list.append(publication)
しかし、私は見返りに取得リストpub_list
- 私が意図したものを行うように見える一方では - 私のデータフレームの長の3倍です。誰かが上記のコードを修正する方法を提案できますか?または、(1)辞書値(ドメイン名)を使用して自分のデータフレームの「リンク」列をフィルタリングすること、(2)辞書キー(パブリケーション名)の新しい「パブリケーション」列を作成すること、 ? (df
は、簡潔にするために1列のみで、ここで作成されていることに注意してください。実際のファイルは、私が上でフィルタリングする列を指定できるようにする必要があり、それによって多くの列を持っているとします。)
編集:私はしたかったいくつかの説明を与えますRagingRooseveltの答え。私はいくつかのドメインが正確に一致しないかもしれないので、マージの使用を避けたい。たとえば、ajc.com
とすると、myajc.com
をキャプチャできます。washingtonpost.com
と入力すると、live.washingtonpost.com
などのサブドメインも使用したいと考えています。したがって、私はstr.contains()
、find()
、またはin
の演算子を使用して、「文字列内の部分文字列を見つける」ソリューションを期待していました。
ありがとうございます。これはうまくいきますが、ドメインの一部が一致していない可能性があるため、 'merge'を使用しないでください。たとえば、 'ajc.com'では' myajc.com'をキャプチャできますし、 'washingtonpost.com'では' live.washingtonpost.com'のようなサブドメインをよくしたがって、いくつかの柔軟性を追加するために、str.contains()またはfind()を使用した「文字列内の部分文字列の検索」ソリューションを期待していました。 – dmitriys
ファジーマッチングが可能であるように見える https://stackoverflow.com/questions/13636848/is-it-possible-to-do-fuzzy-match-merge-with-python-pandas – RagingRoosevelt