2016-04-29 10 views
1

これを行うには長い時間がかかりましたが、私は立ち往生しました。 私は多くの機械で箱を生産しており、各箱には品物が入っています。 すべてのアイテム、ボックスにはシリアルタグが付けられています。複数のカテゴリで発生するシーケンス

画像の結果としてbox_snに基づいてシーケンスカウントを生成したいとします。

私はpandas dataframe solution or and excelフォーミュラを望みます。どの専門家が私にこれを解決するためのヒントを与えることができますか? ありがとうございます。

enter image description here

に編集: 私は下の写真のような単一のcatergoriesに基づいてシーケンス番号を生成することが可能です。 式:G2 = IF(B2 <> B1、G1 + 1、G1) これはbox_snのシーケンスを続行しますが、マシンBのbox_snがシーケンスを再開します。 enter image description here

2: これは私のtemp_readingの最終結果です。どうもありがとうございました。 enter image description here

+0

これが役立つでしょうか? http://stackoverflow.com/a/36652577/5276797 – IanS

+0

あなたのためにコードを書く人がいるようです。 Stack Overflowは、コード作成サービスではなく、Q&Aサイトです。効果的な質問を書く方法については、こちらをご覧ください(http://stackoverflow.com/help/how-to-ask)。 – DSM

+0

私は実際にコーディングスタイルよりもアルゴリズムの提案を求めています。エクセル式はokieです。私はコードを変換したり、計算されたファイルをデータフレームにロードすることができます。念押し有難う。 – pinky

答えて

1

あなたの編集に基づいて、Excelのソリューションは、(列Fに入力された)されます:パンダで

=IF(A2<>A1,1,IF(B2=B1,F1,F1+1)) 
+0

ありがとうございました!シンプルで傲慢! – pinky

+0

行1に直接1を加えてから、(行2を下に) '= F1 *(A2 = A3)+(B2 = B3)'になるのはなぜですか? –

+0

@DirkReichelどのセルに? F2? – ayhan

0

df = pd.read_excel(path) 

を使用してデータを読んだ後、あなたが行うことができ、同じように聞こえる:

df.groupby('box_sn').size() 

IIUCとあなたの目標はbox_snあたりの項目数を取得するのですか?

+0

私の目標は、temp_readingのshmooプロットのようなヒートマップをプロットすることです。 box_snとは無関係に、私はそれをシーケンス順に並べたいと思う。シーケンスの新しい列がプロットの助けになります。 – pinky

+0

df.groupby( 'box_sn')。size()はitems_snを数えています。私はtemp_readingの個別の値が必要です – pinky

+0

@pinkyあなたはまだパンダのソリューションに興味がありますか? – IanS

2

まず、データフレーム作成:

import pandas as pd 
df = pd.DataFrame({ 
     'machine': ['A','A','A','A','B','B','B','B','B','B'], 
     'box_sn': ['A3','A3','A5','A5','B1','B1','B2','B2','B3','B3'], 
     'item_sn': ['i1','i2','i3','i4','i1','i2','i3','i4','i5','i6'] 
    }) 

第2のは、1台のマシンで動作します(B):

dfB = df[df.machine == 'B'] 
(dfB['box_sn'].shift() != dfB['box_sn']).cumsum() 

cumsumは、ボックスのシリアル番号が変更されるたびに増分します。 (これはシリアル番号が注文されていることを前提としています。そうでなければsort_valuesを使用できます。)

第三groupbyを経由して、全体のデータフレームに上記を適用します。

def sequence(df1): 
    return (df1['box_sn'].shift() != df1['box_sn']).cumsum() 
df_sequence = df.groupby('machine').apply(sequence) 

これは出力(私たちは、ほとんどそこにいる)である:

In [17]: df_sequence 
Out[17]: 
machine 
A  0 1 
     1 1 
     2 2 
     3 2 
B  4 1 
     5 1 
     6 2 
     7 2 
     8 3 
     9 3 

第四、我々インデックスの最初のレベル(AB)を削除してから、結果を元のデータフレームに含める必要があります。

df_sequence.index = df_sequence.index.droplevel(0) 
df['sequence'] = df_sequence 
+1

私は昨日、運がないパンダの解決策を見つけるのに1時間近く過ごしました。私は時々スプレッドシートが欠けている。 :) – ayhan

+0

非常に直感的な、私は実際に昨夜以来それをテストします。私は複数のカテゴリに取り組んでいました。例えば機械だけでなく、機械と工場、機械、工場、国 – pinky

関連する問題