2016-10-26 9 views
0

関連するデータを取得するテキストファイルを解析しました。次に、変数(dlOrbit2、imageId3、imageStart4、imageEnd4)を組み合わせて、リスト内の一連の4文字列を作成しました。が一致した後、リスト要素をグループ化する

combined = str(','.join([dlOrbit2, imageId3, imageStart4, imageEnd4])) 
strSplit = combined.split(',') 

プリントは、私が最初の列に一致し、グループの要素を希望

['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'] 
['46290', '514628', '2016-10-26 13:12:54', '2016-10-26 13:13:13'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 

をstrSplit。したがって、46284 x 4、46288 x 6、46290 x 2、46291 x 4となります。これらのグループ内で、要素2から最も早い時刻と要素3からの時刻を取得したいと考えています。

['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:54:57'] 
['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:13:13'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 

このリストは常に4つの要素ですが、グループ化要素の数(最初の列)は常に変更されます。

これらの結果をCSVファイルにエクスポートします。しかし、私は上記のセクションで助けが必要です。

+0

何かしようとしましたか?あなたはどこまで行ったのかを教えてくれますか? – HuStmpHrrr

+0

@HuStmpHrrr私は数日間試してみました。私はただ円で回転し続けます。私は本当に次のステップを知らない。私は辞書に入れようとしましたが、比較して追加しようとしました。 –

+0

ええ、ちょうど私達にコードを示し、私たちは何がうまくいかなかったかを見ていきます。 – HuStmpHrrr

答えて

1

使用pandas

import pandas as pd 

dat = [['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'], 
['46290', '514629', '2016-10-26 13:12:54', '2016-10-26 13:13:13'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06']] 

df = pd.DataFrame(dat).drop_duplicates() 
df_times = df.groupby([0]).agg({2:min,3:max}).reset_index() 
df_times.merge(df,on=[0,2])[[0,1,2,'3_x']] 

出力:

0 46284 514607 2016-10-26 02:43:46 2016-10-26 02:48:39 
1 46288 514626 2016-10-26 09:48:26 2016-10-26 09:54:57 
2 46290 514628 2016-10-26 13:12:34 2016-10-26 13:13:13 
3 46291 514738 2016-10-26 14:56:39 2016-10-26 14:59:06 
+0

これは素晴らしいソリューションですが、列名と注文商品のすべてが少し脆いと感じています。 pandasは 'DataFrame.to_csv()'でcsvへの保存を非常に簡単にします。 – ohruunuruus

0

あなたがgroupbyteeに活用することができます:

data = [ 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'], 
    ['46290', '514629', '2016-10-26 13:12:54', '2016-10-26 13:13:13'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
] 


from itertools import groupby, tee 
import pprint 

res = [] 
for k, g in groupby(data, key=lambda x: x[0]): 
    it1, it2, it3 = tee(g, 3) 
    res.append(next(it1)[:2] + [min(x[2] for x in it2), max(x[3] for x in it3)]) 

pprint.pprint(res) 

出力:

for k, g in groupby(data, key=lambda x: x[0])は、最初の列に基づいて連続する行をグループ化します。最初の項目がグループ化に使用されるキーで、2番目がグループ項目の反復子であるタプルを返します。

it1, it2, it3 = tee(g, 3)は、グループイテレータを3つのイテレータに分割します。これらのイテレータのそれぞれは、まったく同じアイテムを返します。最後に、最初のグループ化された項目から最初の2つの列を取り出し、2つの他のイテレータに対してmin & maxを実行して結果を構成します。

1

私自身、Pythonの新人として、Big Hammersを使う前に基本的なPythonの機能を使った例を見たいと思います。

モジュールのインポートがなくても、12行以下のコード行で実行できるのであれば、その1番目のことを学ぶことが期待されます。

恐らく二重インデックスを持つリストのリストを操作することは理解できませんでしたか?

combined = [['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'], ['46290', '514629', '2016-10-26 13:12:54', '2016-10-26 13:13:13'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06']] 

combined[0][0] # double index 
Out[28]: '46284' 

combined[2][2:] # slice 
Out[29]: ['2016-10-26 02:43:46', '2016-10-26 02:48:39'] 

max(combined[2][2:]) # duck type order comparison 
Out[30]: '2016-10-26 02:48:39' 

なぜ、グループ化する前に入力リストにこれらの基本的なPythonツールを使用する関数を定義していないのですか?

関連する問題