アプリのユーザーエージェント用の列を持つデータフレームがあります。私がする必要があるのは、この列から特定のアプリを識別することです。例えば、
NewWordsWithFriendsFree/2.3 CFNetwork/672.1.15 Darwin/14.0.0
に分類されWords With Friends
ます。
iPhone3,1; iPhone OS 7.1.2; com.fingerarts.sudoku2; 143441-1,24 will be Sudoku by FingerArts etc.
一致させる必要のある文字列を含む別のデータフレームがあります。例えば、
Keyword Game
NewWordsWithFriends Words With Friends
com.fingerarts.sudoku Sudoku by FingerArts
パンダのデータフレームをこのように検索するにはどうすればよいですか?たとえば、データフレームは次のようなものです。
user date user-agent
A 2015-09-02 13:45:56 NewWordsWithFriendsFree/2.3 CFNetwork/672.1.15 Darwin/14.0.0
B 2015-08-31 23:04:21 iPhone3,1; iPhone OS 7.1.2; com.fingerarts.sudoku2; 143441-1,24
GameName
ルックアップ後に新しい列が必要です。
これを達成するための1つの可能な方法は次のとおりです。
import pandas as pd
# some example data
qry = pd.DataFrame.from_dict({"Keyword": ["NewWordsWithFriends",
"com.fingerarts.sudoku"],
"Game": ["Words With Friends",
"Sudoku by FingerArts"]})
df = pd.DataFrame.from_dict({"user-agent" : ["NewWordsWithFriendsFree/2.3 CFNetwork/672.1.15 Darwin/14.0.0",
"iPhone3,1; iPhone OS 7.1.2; com.fingerarts.sudoku2; 143441-1,24"]})
keywords = qry.Keyword.tolist()
games = qry.Game.tolist()
def select(x):
for key, game in zip(keywords, games):
if key in x:
return game
df["GameName"] = df["user-agent"].apply(select)
これにより、次のようになります。
In [41]: df
Out[41]:
user-agent GameName
0 NewWordsWithFriendsFree/2.3 CFNetwork/672.1.15... Words With Friends
1 iPhone3,1; iPhone OS 7.1.2; com.fingerarts.sud... Sudoku by FingerArts
大規模なデータセットに対してこれを行う必要がある場合は、このソリューションのパフォーマンスをテストし、目的に十分な速度があるかどうかを確認する必要があります。
そうでない場合は、たとえば文字列のテスト方法を最適化してください。
考えられるすべてのゲームの外部ループを作成し、それを使用.apply
して列ごとのゲームごとの結果を返すと、select()
などへの各呼び出しですべてのゲームのループが回避されるため、処理が高速化されます。
使用できるボトルネックを特定するにはline_profiler
(Pythonコードを1行ずつプロファイリングするにはどうすればよいですか?を参照)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加