2013-05-02 8 views
16

注文時に部品を表示するcsvファイルがあります。列には、後期、数量、および商品の日数が含まれます。データを値の範囲でグループ化する

データを数日後にグループ化し、数量の合計で商品をグループ化する必要があります。しかし、遅い日は範囲にグループ化する必要があります。

>56 
>35 and <= 56 
>14 and <= 35 
>0 and <=14 

私はどのようにdictを使うことができると思っていました。これは可能な限り、この

{'Red':'>56,'Amber':'>35 and <= 56','Yellow':'>14 and <= 35','White':'>0 and <=14'} 

のようなものは、私は私が私にはわからないので、パンダに新しいです。この

 Red Amber Yellow White 
STRSUB 56 60  74  40 
BOTDWG 20 67  87  34 

のような結果を探しています。誰も助言を与えることができますか?

おかげ

答えて

21

は、このデータで始まると仮定します。

df = pd.DataFrame({'ID': ('STRSUB BOTDWG'.split())*4, 
        'Days Late': [60, 60, 50, 50, 20, 20, 10, 10], 
        'quantity': [56, 20, 60, 67, 74, 87, 40, 34]}) 
# Days Late  ID quantity 
# 0   60 STRSUB  56 
# 1   60 BOTDWG  20 
# 2   50 STRSUB  60 
# 3   50 BOTDWG  67 
# 4   20 STRSUB  74 
# 5   20 BOTDWG  87 
# 6   10 STRSUB  40 
# 7   10 BOTDWG  34 

その後、あなたはpd.cutを使用してステータスのカテゴリを見つけることができます。

df['status'] = pd.cut(df['Days Late'], bins=[-1, 14, 35, 56, 365], labels=False) 
labels = np.array('White Yellow Amber Red'.split()) 
df['status'] = labels[df['status']] 
del df['Days Late'] 
print(df) 
#  ID quantity status 
# 0 STRSUB  56  Red 
# 1 BOTDWG  20  Red 
# 2 STRSUB  60 Amber 
# 3 BOTDWG  67 Amber 
# 4 STRSUB  74 Yellow 
# 5 BOTDWG  87 Yellow 
# 6 STRSUB  40 White 
# 7 BOTDWG  34 White 

今すぐ希望の形でデータフレームを取得するためにpivotを使用します:

df = df.pivot(index='ID', columns='status', values='quantity') 

と、デフォルトでは、pd.cutハーフオープン間隔、(-1, 14], (14, 35], (35, 56], (56, 365]があるのカテゴリにシリーズdf['Days Late']を分割していることに注意してくださいreindexを使用して、行と列の希望の順序を取得します。

df = df.reindex(columns=labels[::-1], index=df.index[::-1]) 

したがって、

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'ID': ('STRSUB BOTDWG'.split())*4, 
        'Days Late': [60, 60, 50, 50, 20, 20, 10, 10], 
        'quantity': [56, 20, 60, 67, 74, 87, 40, 34]}) 
df['status'] = pd.cut(df['Days Late'], bins=[-1, 14, 35, 56, 365], labels=False) 
labels = np.array('White Yellow Amber Red'.split()) 
df['status'] = labels[df['status']] 
del df['Days Late'] 
df = df.pivot(index='ID', columns='status', values='quantity') 
df = df.reindex(columns=labels[::-1], index=df.index[::-1]) 
print(df) 

利回り

 Red Amber Yellow White 
ID        
STRSUB 56  60  74  40 
BOTDWG 20  67  87  34 
+0

これは本当にありがとう、私は日々の仕事の中でPANDASで多くを達成するのに役立つと思います。 mtaddにもありがとう、私はあなたも答えを更新したことに気づきました(それはappretiated)。 – PrestonDocks

6

あなたは次のようにmapまたはapply機能を使用して、日数に基づいてDataFrameに後期列を列を作成することができます。最初にいくつかのサンプルデータを作成しましょう。

df = pandas.DataFrame({ 'ID': 'foo,bar,foo,bar,foo,bar,foo,foo'.split(','), 
         'Days Late': numpy.random.randn(8)*20+30}) 

    Days Late ID 
0 30.746244 foo 
1 16.234267 bar 
2 14.771567 foo 
3 33.211626 bar 
4 3.497118 foo 
5 52.482879 bar 
6 11.695231 foo 
7 47.350269 foo 

日のデータに後期列を変換し、コードと呼ばれる列を追加するヘル​​パー関数を作成します。

def days_late_xform(dl): 
    if dl > 56: return 'Red' 
    elif 35 < dl <= 56: return 'Amber' 
    elif 14 < dl <= 35: return 'Yellow' 
    elif 0 < dl <= 14: return 'White' 
    else: return 'None' 

df["Code"] = df['Days Late'].map(days_late_xform) 

    Days Late ID Code 
0 30.746244 foo Yellow 
1 16.234267 bar Yellow 
2 14.771567 foo Yellow 
3 33.211626 bar Yellow 
4 3.497118 foo White 
5 52.482879 bar Amber 
6 11.695231 foo White 
7 47.350269 foo Amber 

最後に、あなたはIDコードで列を集約するgroupbyを使用して、次のようにグループの数を取得することができます:

g = df.groupby(["ID","Code"]).size() 
print g 

ID Code 
bar Amber  1 
    Yellow 2 
foo Amber  1 
    White  2  
    Yellow 2 

df2 = g.unstack() 
print df2 

Code Amber White Yellow 
ID 
bar  1 NaN  2 
foo  1  2  2 
+0

ありがとうございます。私は今日の仕事でこれを見て、それがどのようになったかを教えてくれるでしょう。 – PrestonDocks

+0

これらの結果をどのようにピボットできるか教えてください。私はgroupbyがピボットすることができないシリーズを生産すると思う。 – PrestonDocks

+0

'groupby'メソッドは' MultiIndex'で 'Series'を生成します。上記の編集された答えに示すように、 'unstack'を使用して最下位レベルのインデックスをカラムにピボットさせることができます。 – mtadd

3

私は、これは少し遅れて来ているけど、私はあなたと同じ問題を抱えていたし、機能のnp.digitizeを共有したいと思いました。それはまさにあなたが望むもののように聞こえる。

a = np.random.randint(0, 100, 50) 
grps = np.arange(0, 100, 10) 
grps2 = [1, 20, 25, 40] 
print a 
[35 76 83 62 57 50 24 0 14 40 21 3 45 30 79 32 29 80 90 38 2 77 50 73 51 
71 29 53 76 16 93 46 14 32 44 77 24 95 48 23 26 49 32 15 2 33 17 88 26 17] 

print np.digitize(a, grps) 
[ 4 8 9 7 6 6 3 1 2 5 3 1 5 4 8 4 3 9 10 4 1 8 6 8 6 
    8 3 6 8 2 10 5 2 4 5 8 3 10 5 3 3 5 4 2 1 4 2 9 3 2] 

print np.digitize(a, grps2) 
[3 4 4 4 4 4 2 0 1 4 2 1 4 3 4 3 3 4 4 3 1 4 4 4 4 4 3 4 4 1 4 4 1 3 4 4 2 
4 4 2 3 4 3 1 1 3 1 4 3 1] 
関連する問題