17

注文中の部品を示す 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

私はパンダが初めてなので、これが可能かどうかはまったくわかりません。誰でもアドバイスをいただけますか。

ありがとう

4

3 に答える 3

26

次のデータから始めるとします。

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。デフォルトでは、pd.cutはシリーズを半開区間でdf['Days Late']あるカテゴリに分割することに注意してください。(-1, 14], (14, 35], (35, 56], (56, 365]

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目的の形式で DataFrame を取得するために使用します。

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

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
于 2013-05-03T13:18:06.180 に答える
4

これが少し遅れていることは知っていますが、私はあなたと同じ問題を抱えていて、関数 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]
于 2014-10-16T00:35:35.777 に答える