2017-07-08 2 views
8

My DataFrameには第1列の文字列と第2列の数値が入ります。pandas DataFrameオブジェクトからpythonリストオブジェクトまたは任意のオブジェクトを作成して、異なる行の値をグループ化する必要があります

  GEOSTRING IDactivity 
9  wydm2p01uk0fd2z   2 
10 wydm86pg6r3jyrg   2 
11 wydm2p01uk0fd2z   2 
12 wydm80xfxm9j22v   2 
39 wydm9w92j538xze   4 
40 wydm8km72gbyuvf   4 
41 wydm86pg6r3jyrg   4 
42 wydm8mzt874p1v5   4 
43 wydm8mzmpz5gkt8   5 
44 wydm86pg6r3jyrg   5 
45 wydm8w1q8bjfpcj   5 
46 wydm8w1q8bjfpcj   5 

私がしたいことは、それぞれの "IDactivity"値ごとに "GEOSTRING"値ごとに5文字目からなる文字列を含むリストオブジェクトを持つためにこのDataFrameを操作することです。 だからこのケースでは、私は3つの異なった「IDactivity」の値を持っている、と私は私のリストオブジェクトに次のようになり3つの文字列になります。もう一度、あなたは各文字列で参照シンボルは、ある

['2828', '9888','8888'] 

を各「GEOSTRING」値の5番目の値。

私が求めているのは、あまりにも複雑なループではなく、たくさんのデータを操作しなければならないので、可能な限り効率的な解決策です。私はそれがきれいで速くなるようにしたい。

私はそれが十分明確であることを望みます。

答えて

9

1つのライナーとして次のように、これは簡単に行うことができる:(あまりにも非常に高速であると考えられる)

result = df.groupby('IDactivity')['GEOSTRING'].apply(lambda x:''.join(x.str[4])).tolist() 

このグループがデータフレームをIDactivityの値によって、次にGEOSTRING列の対応する各列から5を選択要素(インデックス4)を作成し、それを他の対応する文字列と結合します。最後に、tolist()メソッドを追加して、pandasシリーズではなくリストとして出力します。

出力:

['2828', '9888', '8888'] 

ドキュメント:

pandas.groupby
pandas.apply

1

はここで一時列を含むソリューションです、とthis answerからキー操作のためのインスピレーションを取る:

# create a temp column with the character we want from each string 
dframe['Temp'] = dframe['GEOSTRING'].apply(lambda x: x[4]) 

# groupby ID and then concatenate using a sneaky call to .sum() 
dframe.groupby('IDactivity')['Temp'].sum().tolist() 

結果:

['2828', '9888', '8888'] 
+0

これは、私がデータフレームを処理する方法を学んでいるので、実際に有用です。 Rayhaneの答えはおそらくもっと速いですが、あなたも役に立ちました。ありがとう – zampero

関連する問題