2017-11-10 17 views
1

考える:

DFの下から、Python_Pandas:datetime値は、特定の日付期間に該当する場合は、特定の値を持つ列を作成

df = pd.DataFrame(
      {"date":['2016-6-1', '2016-9-22', '2016-10-28', '2016-11-4', '2016-6-29', '2016-10-1', '2016-6-15', '2016-7-29', '2016-11-1'], 
      "score":[9, 8, 8, 10, 6, 7, 7, 7, 6] 
      }) 

は、タスクの下に実行します。日付の

は基準を下回っ満たします'staffNumber'という新しく追加された列に特定の値を追加します。

IF 'date'が6/1/2016〜9/22/2016になる場合1の値を持つ新しい列を作成します。

'日付が'/'日付が' 10/2016分の29〜11の下に該当する場合2.

の値を持つ新しい列を作成しますが9/2016分の23 ~10/2016分の28の下にある場合2016分の4 THANは次のようになります。3

最終結果の値を持つ新しい列を作成します。

df2 = pd.DataFrame(
      {"date":['2016-6-1', '2016-9-22', '2016-10-28', '2016-11-4', '2016-6-29', '2016-10-1', '2016-6-15', '2016-7-29', '2016-11-1'], 
      "score":[9, 8, 8, 10, 6, 7, 7, 7, 6], 
      "staffNumber":[1,1,2,3,1,2,1,1,3] 
      }) 

end result

私が試したもの:

私は通常質問をする前に何かを試します。しかし、これについて私はどんなアプローチも考えられませんでした。

私は、リンクをたどることからnp.where & .isinを使用して見て: 1. Python numpy where function with datetime 2. Using 'isin' on a date in a pandas column 3. Pandas conditional creation of a series/dataframe column

任意の助けが理解されるであろう!

答えて

1

使用cut

#convert to datetimes if necessary 
df['date'] = pd.to_datetime(df['date']) 
b = pd.to_datetime(['2016-06-01','2016-09-22','2016-10-28','2016-11-04']) 
l = range(1,4) 
df['new'] = pd.cut(df['date'], bins=b, labels=l, include_lowest=True) 
print (df) 
     date score new 
0 2016-06-01  9 1 
1 2016-09-22  8 1 
2 2016-10-28  8 2 
3 2016-11-04  10 3 
4 2016-06-29  6 1 
5 2016-10-01  7 2 
6 2016-06-15  7 1 
7 2016-07-29  7 1 
8 2016-11-01  6 3 

またはnumpy.searchsorted:一般的に

#change first date to 2016-05-31 
b = pd.to_datetime(['2016-05-31','2016-09-22','2016-10-28','2016-11-04']) 
l = range(1,4) 

df['new'] = np.array(l)[b.searchsorted(df['date'].values) - 1] 
print (df) 
     date score new 
0 2016-06-01  9 1 
1 2016-09-22  8 1 
2 2016-10-28  8 2 
3 2016-11-04  10 3 
4 2016-06-29  6 1 
5 2016-10-01  7 2 
6 2016-06-15  7 1 
7 2016-07-29  7 1 
8 2016-11-01  6 3 
+0

これはサンプルDFのために働きました。しかし、私が解決しなければならない問題のために、私は6つの異なる日付範囲、6/1/2016〜今、これらの範囲はすべて異なる値を持っています(1,2,1,0,1,0,1,0、-1 、-2、-3、-4、-4、-3、-2、-3)である。 最初のアプローチ 'cut'メソッドはValueErrorでは機能しませんでした:カテゴリカテゴリは一意でなければなりません。 私は2番目の方法を試しています。しかし、どこで2番目の方法で範囲(1,4)を適用しましたか?もう一つ懸念しているのは私の問題です。負の数もあります。 – Johnny

+0

私は答えを編集し、 'searchosrted'関数から返されたインデックスでのみ' l'を使っています。 – jezrael

0

は、これを実現するには、あなたは関係なく、日付の値の列を作成する必要があります。

df['employee'] = ...some_value_here... 

次に、指定した範囲内に日付がある場合は、値を割り当てる必要があります。あなたはラムダでそれを行うことができます。

df['employee'] = df['date'].apply(lambda x : __something__) 

今、あなたはあなたが必要とする値に(文字列です!)その日付範囲を割り当てロジックとラムダの内側__something__を交換してください。

ラムダの内部その__something__が非常に長い場合には読めません。前にそれをしない関数を定義し、(ラムダX:justdefinedfunction(X))を適用し

関連する問題