- これを行うには、より速く、もっとpythonicな方法がありますか?
- この警告を生成する とは何ですか?
UserWarning: Boolean Series key will be reindexed to match DataFrame index. "DataFrame index.", UserWarning
私はそれに気を付ける必要がありますか?
私はcsvファイルにorg、month、personの3つの列があります。私はpandas.core.frame.DataFrame
に読んだPython 3.5でサブセットを簡単に比較できるように、データテーブルを構造化してアクセスするにはどうすればよいですか?
| org | month | person |
| --- | ---------- | ------ |
| 1 | 2014-01-01 | 100 |
| 1 | 2014-01-01 | 200 |
| 1 | 2014-01-02 | 200 |
| 2 | 2014-01-01 | 300 |
:
data = pd.read_csv('data_base.csv', names=['month', 'org', 'person'], skiprows=1)
最終目標は、最初の期間中の人物のセットで2期連続の間に人々の共通部分を比較することです。
org: 1, month: 2014-01-01, count(intersection((100, 200), 200))/len(set(100, 200)) == 0.5
編集:
このような出力を生成しimport pandas as pd
import sys
data = pd.read_csv('data_base.csv', names=['month', 'org', 'person'], skiprows=1)
data.sort_values(by=['org', 'month', 'person'])
results = {}
for _org in set(data.org):
results[_org] = {}
months = sorted(list(set(data[data.org == _org].month)))
for _m1, _m2 in zip(months, months[1:]):
_s1 = set(data[data.org == _org][data.month == _m1].person)
_s2 = set(data[data.org == _org][data.month == _m2].person)
results[_org][_m1] = float(len(_s1 & _s2)/len(_s1))
print(str(_org) + '\t' + str(_m1) + '\t' + str(_m2) + '\t' + str(round(results[_org][_m1], 2)))
sys.stdout.flush()
::私はそれはで動作するようになった
UserWarning: Boolean Series key will be reindexed to match DataFrame index. "DataFrame index.", UserWarning
5640 2014-01-01 2014-02-01 0.75
5640 2014-02-01 2014-03-01 0.36
5640 2014-03-01 2014-04-01 0.6
...
しかし、それは本当に遅いと醜いのようなものだ...で、エンベロープ計算の現在のレートは、2年間のデータバッチで約22時間と見積もっています。
パンダは完全な操作に適しており、スライシングには適していません。1つの要素にアクセスする時間は、10〜100マイクロ秒のオーダーで、辞書ルックアップ(50 ns未満)の場合の1000倍になります。 pandasは、大規模なデータを含むフルデータフレームまたは列方向の計算に最適です。長い開始時間は、非常に高速でベクトル化された計算とうまく相殺されます。 ここでは、要素ごとの計算とPandasタイプからの変換を効果的に行っています.Pandasは優れていますが、このタスクに適したライブラリではありません。 –