の間で選択、私はいくつかのデータクリーニングを行うと口論とこれは各.csvファイルの最終的な構造です(図解の目的でのみ偽のデータ)。はパンダ、OOPクラス、およびdicts(パイソン)
import pandas as pd
data = [[112233, 'Rob', 99], [445566, 'John', 88]]
managers = pd.DataFrame(data)
managers.columns = ['ManagerId', 'ManagerName', 'ShopId']
print managers
ManagerId ManagerName ShopId
0 112233 Rob 99
1 445566 John 88
data = [[99, 'Shop1'], [88, 'Shop2']]
shops = pd.DataFrame(data)
shops.columns = ['ShopId', 'ShopName']
print shops
ShopId ShopName
0 99 Shop1
1 88 Shop2
data = [[99, 2000, 3000, 4000], [88, 2500, 3500, 4500]]
sales = pd.DataFrame(data)
sales.columns = ['ShopId', 'Year2010', 'Year2011', 'Year2012']
print sales
ShopId Year2010 Year2011 Year2012
0 99 2000 3000 4000
1 88 2500 3500 4500
それから私は、データフレームを反復しながら、カスタムExcelシートとの.pdfレポートを作成するためのxlsxwriter
とreportlab
Pythonパッケージを使用しています。すべてが素晴らしく、指定されたすべてのパッケージは本当にうまく機能します。
私の関心は、しかし、私は私のコードは、私は複数の呼び出しで同じデータフレームの列を複数回アクセスする必要があるとして維持するのは難しいなっていることを感じていることです。
は、私は私のコードは、呼び出しのこの種で満たされた年2010年に1500以上の売上高を持っていた店を担当するマネージャー名を取得する必要が言う:
managers[managers['ShopId'].isin(
sales[sales['Year2010'] > 1500]['ShopId'])]['ManagerName'].values
>>> array(['Rob', 'John'], dtype=object)
私は見えにくいと思いますこのコード行を読んでいる間、何が起こっているのですか?私は複数の中間変数を作成することができますが、これは複数行のコードを追加します。
それはデータベースの正規化のイデオロギーを犠牲にし、より保守コードを取得するために単一のデータフレームにすべてのピースをマージする方法が一般的ですか?後で必要とされる可能性のある他のデータフレームをマージしようとすると、混乱を招く可能性があるため、単一のデータフレームを持つことは明らかです。それらをマージすると、同じマネージャーを複数のショップに割り当てることができるため、データの冗長性がもたらされます。
df = managers.merge(sales, how='left', on='ShopId').
merge(shops, how='left', on='ShopId')
print df
ManagerId ManagerName ShopId Year2010 Year2011 Year2012 ShopName
0 112233 Rob 99 2000 3000 4000 Shop1
1 445566 John 88 2500 3500 4500 Shop2
少なくとも、この呼び出しが小さくなる:たぶん
df[df['Year2010'] > 1500]['ManagerName'].values
>>> array(['Rob', 'John'], dtype=object)
パンダは、ジョブのこの種の間違ったツールですか?
私のオフィスでは、開発者がぼんやりして、クラスを使用するように教えていますが、その後、get_manager_sales(managerid)
などの方法を使用します。レポート用のクラスインスタンスを反復することは、ソートやインデックス作成(私はpandas
で無料)を実装する必要があるため、面倒です。
辞書は動作しますが、それは、それはまた難しいはるかに良いのいずれかを取得しないマージなどの構文やって、既存のデータを修正することができます。
data_dict = df.to_dict('records')
[{'ManagerId': 112233L,
'ManagerName': 'Rob',
'ShopId': 99L,
'ShopName': 'Shop1',
'Year2010': 2000L,
'Year2011': 3000L,
'Year2012': 4000L},
{'ManagerId': 445566L,
'ManagerName': 'John',
'ShopId': 88L,
'ShopName': 'Shop2',
'Year2010': 2500L,
'Year2011': 3500L,
'Year2012': 4500L}]
年に1500以上の私はで動作データとこの特定のケースでは、2010年
[row['ManagerName'] for row in data_dict if row['Year2010'] > 1500]
>>> ['Rob', 'John']
を販売していた店を担当する
取得マネージャーの名前は、私はすべての道を行く必要がありますpandas
を使用するか、またはpandas
の力を利用しながらクリーナーコードを書く別の方法がありますか?
答えに感謝して、レポートプログラムを書くためのパンダを選ぶことは正しいことだと確信しました。常に複数のフレームを相互参照するのを避けるために、すべてのcsvファイルのデータフレームを1つのデータフレームにマージすることも検討してください。 –
@AlexTereshenkov、あなたはあなたのテーブルを非正規化し、すべてのものを1つのフラットDFに入れることができますが、[可能性のある落とし穴]に注意してください(http://stackoverflow.com/questions/40002355/pandas-left-join-why-more)。 -results/40002535#40002535) – MaxU