2016-05-10 3 views
0

特定の条件があれば、パンダのDataFrameの列を1つに集計したいと思います。この考え方は、DF内のスペースを節約し、ある条件に答える限り、列の一部を1つに集約することです。 例はおそらく、それが簡単に説明することになるだろう:パンダ:パンダのDataFrameの* columns *のいくつかを集計するには

import pandas as pd 
import seaborn as sns  # for sample data set 

# load some sample data 
titanic = sns.load_dataset('titanic') 

# round the age to an integer for convenience 
titanic['age_round'] = titanic['age'].round(0) 

# crosstabulate 
crtb = pd.crosstab(titanic['embark_town'], titanic['age_round'], margins=True) 
crtb 

利回り:

enter image description here

私が何をしたいのか、例えば、> = 20であるすべての列を集約することです(たとえば、'20 + 'と呼ばれる1つの列に値が設定され、値は集計された列の行ごとのすべての値の合計になります。列ヘッダーが<である場合、それらは分離されていて手つかずのままです。 元のDFにもう1つの列を作成して、< 20と'20 + 'elseの場合はage_roundedの元の値を、別の列を作成するか、.cutを使用してそれをピボットします。

新しい欄を作成しなくても、もっと巧みにやり直す方法があるのだろうか? ありがとう!

答えて

0

この特定の例では、私はちょうどあなたが既に持っている列の値を更新し、あなたが列を追加する必要はないと思う:

import pandas as pd 
import seaborn as sns  # for sample data set 

# load some sample data 
titanic = sns.load_dataset('titanic') 

# round the age to an integer for convenience 
titanic['age_round'] = titanic['age'].round(0) 
titanic.loc[titanic['age_round']>=20, 'age_round'] = '20+' 

# crosstabulate 
crtb = pd.crosstab(titanic['embark_town'], titanic['age_round'], margins=True) 

は、一般的にこれを行う方法を、あなたの質問か?パンダにデータを集約するにはさまざまな方法がありますが、最も標準的なのは.groupby()構造を使用することです。クロス集計は、基本的には、これらの2つの変数をグループ化してから、.unstack()を呼び出すという簡単な方法です。

+0

返信いただきありがとうございます。はい、私は一般的な解決策を探しています。あなたが提案するこの解決策は、実際の列の値を変更する意味で私のものと似ています。私は列ヘッダー(実際の値に集計関数を適用する)に適用できるソリューションがあることを期待していました。 – Optimesh

+0

それはあまり意味がないでしょう - あなたの価値はあなたの列見出しになります。彼らがヘッダーになるまで待っていれば、もっと多くの作業ができます。 – flyingmeatball

関連する問題