2017-08-04 13 views
4

私のデータは工場からの不在レコードです。ある日は休みがないので、その日に記録されたデータや日付はありません。しかし、他の例が示されているところでこれが毛むくじゃらするところでは、さまざまな理由でいくつかの欠席がある可能性があります。データには常に1対1の比率のデータが記録されるとは限りません。上Pandas Reindexで不足する日付を記入するか、より良い方法で記入しますか?

(index) Shift  Description  Instances (SUM) 
01-01-14 2nd Baker Discipline  0 
01-01-14 2nd Baker Vacation  0 
01-01-14 1st Cooks Discipline  0 
01-01-14 1st Cooks Vacation  0 
01-02-14 2nd Baker Discipline  4 
01-02-14 2nd Baker Vacation  3 
01-02-14 1st Cooks Discipline  3 
01-02-14 1st Cooks Vacation  3 

そしてそう:私は願ってい

結果はこのようなものです。アイデアはすべてシフトしており、説明には期間中のすべての日の値が含まれます(この例では、2014年1月1日〜2014年12月31日)

私はいくつかの例を読み、この作業を行うまではhereです。

ts = pd.read_csv('Absentee_Data_2.csv' 
       , encoding = 'utf-8' 
       ,parse_dates=[3] 
       ,index_col=3 
       ,dayfirst=True 
       ) 

idx = pd.date_range('01.01.2009', '12.31.2017') 

ts.index = pd.DatetimeIndex(ts.index) 
# ts = ts.reindex(idx, fill_value='NaN') 
df = pd.DataFrame(index = idx) 
df1 = df.join(ts, how='left') 

ただし、ts = ts.reindex(idx, fill_value='NaN')のコメントを外すと、エラーメッセージが表示されます。私は何をしようとしているのかを達成するために少なくとも10の方法を試しました。これは正しい道であると100%確信していませんが、それは私にあらゆる進歩に最も近いと思われます。ここで

は、いくつかのサンプルデータです:あなたは助けるために

Description Unexcused Instances Date  Shift 
Discipline FALSE    1 Jan 2 2014 2nd Baker 
Vacation TRUE    2 Jan 2 2014 1st Cooks 
Discipline FALSE    3 Jan 2 2014 2nd Baker 
Vacation TRUE    1 Jan 2 2014 1st Cooks 
Discipline FALSE    2 Apr 8 2014 2nd Baker 
Vacation TRUE    3 Apr 8 2014 1st Cooks 
Discipline FALSE    1 Jun 1 2014 2nd Baker 
Vacation TRUE    2 Jun 1 2014 1st Cooks 
Discipline FALSE    3 Jun 1 2014 2nd Baker 
Vacation TRUE    1 Jun 1 2014 1st Cooks 
Vacation TRUE    2 Jul 5 2014 1st Cooks 
Discipline FALSE    3 Jul 5 2014 2nd Baker 
Vacation TRUE    2 Dec 3 2014 1st Cooks 

は、事前にありがとう、私はあまり進展せず、この中初心者と2日間です。ここの人々が答えをどのように手助けしてくれるのか、本当に感謝します。私のような初心者は、知恵が共有されていることに非常に感謝しています。私はあなただけのdatetimeの使用に問題があると思う

答えて

2

は、このアプローチは、あなたが何を望むかのかなり接近していた

実際
ts.set_index(['Date'],inplace=True) 
ts.index = pd.to_datetime(ts.index,format='%b %d %Y') 
d2 = pd.DataFrame(index=pd.date_range('2014-01-01','2014-12-31')) 

print ts.join(d2,how='right') 
+2

両方の回答は機能しましたが、この1つは私の実際のデータを理解してループスルーするのが簡単でした。それ以上の操作と思考が必要でしたが、これは私が使用した答えです。 – SDS

1

私のために働いた(私はあなたが探しているように見える出力を正しく理解と仮定しますために)。あなたが追加したいものを基本的に

import pandas as pd 

ts = pd.read_csv('Absentee_Data_2.csv', encoding = 'utf-8',parse_dates=[3],index_col=3,dayfirst=True, sep=",") 

idx = pd.date_range('01.01.2009', '12.31.2017') 

ts.index = pd.DatetimeIndex(ts.index) 
#ts = ts.reindex(idx, fill_value='NaN') 
df = pd.DataFrame(index = idx) 
df1 = df.join(ts, how='left') 
df2 = df1.copy() 
df3 = df1.copy() 
df4 = df1.copy() 
dict1 = {'Description': 'Discipline', 'Instances': 0, 'Shift': '1st Cooks'} 
df1 = df1.fillna(dict1) 
dict1["Description"] = "Vacation" 
df2 = df2.fillna(dict1) 
dict1["Shift"] = "2nd Baker" 
df3 = df3.fillna(dict1) 
dict1["Description"] = "Discipline" 
df4 = df4.fillna(dict1) 
df_with_duplicates = pd.concat([df1,df2,df3,df4]) 
final_res = df_with_duplicates.reset_index().drop_duplicates(subset=["index"] + list(dict1.keys())).set_index("index").drop("Unexcused", axis=1) 

:上記のコードに私の追加を参照してくださいtsdf1

  • fillna(dict1)で作成したDFほとんど空

    • コピー4回は静的で埋めることができます
    • 4つのdfsを連結すると、csvの元の値が4回重複しているため、いくつかの重複を削除する必要があります。
    • ドロップ重複、我々は `set_index(「インデックス」)が続くのでreset_index、付加価値を維持するために、インデックスを必要
    • 最後に最後にUnexcused

    いくつかの出力をドロップします。

    In [5]: final_res["2013-01-2"] 
    Out[5]: 
          Description Instances  Shift 
    index          
    2013-01-02 Discipline  0.0 1st Cooks 
    2013-01-02 Vacation  0.0 1st Cooks 
    2013-01-02 Vacation  0.0 2nd Baker 
    2013-01-02 Discipline  0.0 2nd Baker 
    
    In [6]: final_res["2014-01-2"] 
    Out[6]: 
          Description Instances  Shift 
    index           
    2014-01-02 Discipline  1.0 2nd Baker 
    2014-01-02 Vacation  2.0 1st Cooks 
    2014-01-02 Discipline  3.0 2nd Baker 
    2014-01-02 Vacation  1.0 1st Cooks 
    1 
    
  • +0

    この解決方法を試しても、次のようなエラーが表示されます。 'タイプエラー:次のコード行で' dict_keys 'ではなく、リストを連結するだけです:final_res = \t \t \t \t \t .drop_duplicates(サブセット= [ "インデックス"] \t \t \t \t \t \t \t \t \t \t + dict1.keys())\t .set_index( "インデックス")。降下( "Unexcused"、軸= 1))」 助言がありますか?ありがとうと説明してくれてありがとうございます:) – SDS

    +0

    @SDS私の悪い小さな誤植は、あなたは 'dict1'のキーをリストに変換する必要があるので、' subse t = ["index"] + list(dict1.keys()) '、私は私の投稿を編集しました – Adonis

    +0

    @SDS答えが提供されていると感じたら、それを合格とマークしてください。未解決の質問に焦点を当てるのに役立ちます。回答が役に立たなかった場合、欠落しているものについてのフィードバックを提供できますか? – Adonis

    関連する問題