2017-11-02 21 views
0

pandasデータフレームは、値が特定のしきい値を満たしていない場合は時間単位の値 を返すSQLクエリの出力です。欠損時間を埋める方法pandas DataFrameの値

 
date_date | hour24 | column 
------------------------------------ 
2017-10-29 | 00:00 | 5.8055152395 
2017-10-29 | 01:00 | 1.2578616352 
2017-10-29 | 02:00 | -1.5197568389 
2017-10-29 | 03:00 | -12.5560538117 
2017-10-29 | 04:00 | -15.6862745098 
2017-10-29 | 05:00 | -18.487394958 
2017-10-29 | 06:00 | -13.2911392405 
2017-10-29 | 07:00 | -9.3385214008 
2017-10-29 | 08:00 | -15.3846153846 
2017-10-28 | 00:00 | 6.9666182874 
2017-10-28 | 01:00 | 8.3857442348 
2017-10-28 | 02:00 | 8.8145896657 
2017-10-28 | 03:00 | 4.0358744395 
2017-10-28 | 04:00 | 13.0718954248 
2017-10-28 | 05:00 | 0 
2017-10-28 | 06:00 | 13.9240506329 
2017-10-28 | 07:00 | 24.513618677 

この出力を使用してレポートを作成します。 クエリが値を返す場合は1時間ごとに失敗とマークしたいが、値が合格とマークされるしきい値を超えていない の時間も欲しい。

 
date_date | hour24 | Result 
------------------------------ 
2017-10-29 | 00:00 | Failed 
2017-10-29 | 01:00 | Failed 
2017-10-29 | 02:00 | Failed 
2017-10-29 | 03:00 | Failed 
2017-10-29 | 04:00 | Failed 
2017-10-29 | 05:00 | Failed 
2017-10-29 | 06:00 | Failed 
2017-10-29 | 07:00 | Failed 
2017-10-29 | 08:00 | Failed 
2017-10-29 | 09:00 | Passed 
2017-10-29 | 10:00 | Passed 
2017-10-29 | 11:00 | Passed 
2017-10-29 | 12:00 | Passed 
2017-10-29 | 13:00 | Passed 
2017-10-29 | 14:00 | Passed 
2017-10-29 | 15:00 | Passed 
2017-10-29 | 16:00 | Passed 
2017-10-29 | 17:00 | Passed 
2017-10-29 | 18:00 | Passed 
2017-10-29 | 19:00 | Passed 
2017-10-29 | 20:00 | Passed 
2017-10-29 | 21:00 | Passed 
2017-10-29 | 22:00 | Passed 
2017-10-29 | 23:00 | Passed 
2017-10-28 | 00:00 | Failed 
2017-10-28 | 01:00 | Failed 
. 
. 
. 
+0

あなたは 'プリント(df.dtypes)'の出力を投稿することができますか? – MaxU

+1

確かに、 date_date -------->オブジェクト、 時24 ------------>オブジェクト、 カラム------------>オブジェクト – theSanjeev

答えて

3

あなたは

In [1]: reporting_df.columns 
Out[1]: Index(['date_date', 'Hour'], dtype='object')` 

のように報告するために必要な列とサンプルデータフレームを作成し、data_date列のSQLクエリ出力からのデータフレーム

In [2]: out_df = pd.merge(left=reporting_df, right=query_df, on='date_date', how='inner') 
Out[2]: out_df.head(3) 
date_date hour24 column 
2017-10-29 00:00 5.8055152395 
2017-10-29 01:00 1.2578616352 
2017-10-29 02:00 -1.5197568389 
2017-10-29 03:00 -12.5560538117 
2017-10-29 04:00 NaN 
でreporting_dfをマージすることができます

ステータスを取得するためにnp.whereを使用

In [3]: out_df['Status'] = np.where(pd.isnull(out_df['column']), 'Success', 'Fail') 

とこれは、それがここで提供入力を使用して、最終的に使用して行われていた方法です不要な列に

In [4]: out_df.drop('column', axis=1, inplace=True) 
In [5]: out_df.head(3) 
Out[5]: 
date_date hour24 status 
2017-10-29 00:00 Fail 
2017-10-29 01:00 Fail 
2017-10-29 02:00 Fail 
2017-10-29 03:00 Fail 
2017-10-29 04:00 Pass 
1

各行が別のデータフレームの行と一致するかどうかをチェックする関数をデータフレームに適用できます。
1.日付と時刻が
2.あなたが持っている、またはデータフレーム(df_all_dates)を作成することができますユニークでテストしたいすべての日付と時刻が含まれています

このソリューションは、いくつかのことを前提としています。

# some setup for this example 
import pandas as pd 
x, y = [], [] 
for i in range(5): 
    x.append("{:02d}:00".format(i)) 
    y.append("2017-10-29") 

df_all_dates = pd.DataFrame(data=list(zip(x,y)), columns=["date", "time"]) 
df_all_dates 

出力:

date time 
0 00:00 2017-10-29 
1 01:00 2017-10-29 
2 02:00 2017-10-29 
3 03:00 2017-10-29 
4 04:00 2017-10-29 
# as an example, assume the first two rows were returned by your sql query 
df_sql_query = df_all_dates.head(2) 
df_sql_query 

出力:

date time 
0 00:00 2017-10-29 
1 01:00 2017-10-29 

重要なビット:

# check if each row in df_all_dates has the same date and time 
# as any row from df_sql_query 
def passed_threshold(data): 
    if ((df_sql_query['date'] == data["date"]) & (df_sql_query['time'] == data["time"])).any(): 
     return "Failed" 
    else: 
     return "Passed" 

df_all_dates["Result"] = df_all_dates.apply(passed_threshold, axis=1) 
df_all_dates 

出力:

date time Result 
0 00:00 2017-10-29 Failed 
1 01:00 2017-10-29 Failed 
2 02:00 2017-10-29 Passed 
3 03:00 2017-10-29 Passed 
4 04:00 2017-10-29 Passed 
3

をドロップ:

データフレームのみが時系列値を含む作成されました:

In [1]: df_time = pd.DataFrame(pd.date_range(start='20171029 00', end='20171030 00', freq='1H'), columns=['date_date']) 
In [2]:df_time.head() 
Out[2]: 
    date_date 
0 2017-10-29 00:00:00 
1 2017-10-29 01:00:00 
2 2017-10-29 02:00:00 
3 2017-10-29 03:00:00 
4 2017-10-29 04:00:00 

元のデータフレーム:

In[3]:df.head() 
out[3]: 
 
    date_date hour24 ?column? 
0 2017-10-29 00:00 5.805515 
1 2017-10-29 01:00 1.257862 
2 2017-10-29 02:00 -1.519757 
3 2017-10-29 03:00 -12.556054 
4 2017-10-29 04:00 -15.686275 

最初の列の日付と時間を組み合わせてnpに変換します。datetime64

In[4]:df['date_date'] = (df.date_date.map(str) + ' ' + df.hour24.map(str)).astype(np.datetime64) 

は、データフレームのDFをマージし、df_time

In[5]: df = pd.merge(df, df_time, on=['date_date'], how='outer') 

は、条件が満たされnp.where使用してステータスを設定します。

In[6]: df['Status'] = np.where(pd.isnull(df.iloc[:,2]), 'Pass', 'Fail') 

不要な列を削除します。

In[7]: df.drop(['?column?', 'hour24'], inplace=True, axis=1) 

値を並べ替えます。

In[8]: df.sort_values(by=['date_date'], inplace=True) 

最終的に望ましい出力が得られます。

In[9]: df.head(24) 
Out[9]: 
 
      date_date Status 
9 2017-10-28 00:00:00 Fail 
10 2017-10-28 01:00:00 Fail 
11 2017-10-28 02:00:00 Fail 
12 2017-10-28 03:00:00 Fail 
13 2017-10-28 04:00:00 Fail 
14 2017-10-28 05:00:00 Fail 
15 2017-10-28 06:00:00 Fail 
16 2017-10-28 07:00:00 Fail 
17 2017-10-28 08:00:00 Pass 
18 2017-10-28 09:00:00 Pass 
19 2017-10-28 10:00:00 Pass 
20 2017-10-28 11:00:00 Pass 
21 2017-10-28 12:00:00 Pass 
22 2017-10-28 13:00:00 Pass 
23 2017-10-28 14:00:00 Pass 
24 2017-10-28 15:00:00 Pass 
25 2017-10-28 16:00:00 Pass 
26 2017-10-28 17:00:00 Pass 
27 2017-10-28 18:00:00 Pass 
28 2017-10-28 19:00:00 Pass 
29 2017-10-28 20:00:00 Pass 
30 2017-10-28 21:00:00 Pass 
31 2017-10-28 22:00:00 Pass 
32 2017-10-28 23:00:00 Pass 

関連する問題