簡體   English   中英

使用python中具有唯一ID的另一個幀從另一個具有重復ID的數據幀中查找值

[英]Find the values from another data frame with repetitive ids using another frame with unique id in python

我真的陷入了這個問題,不知道如何解決。 我有兩個數據框,一個是濕度,它的數據每 15 分鍾報告一次。 我有三種不同的傳感器用於報告。 因此,該表包括報告的 ID、日期和時間。 這是:

df_h = pd.DataFrame({'id_h': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3, 5: 3}, 'date': {0: '2021-01-01', 1: '2021-01-01', 2: '2021-01-01', 3: '2021-01-01', 4: '2021-01-01', 5: '2021-01-01'}, 'time_hour': {0: '6:00:00', 1: '6:15:00', 2: '6:00:00', 3: '6:15:00', 4: '6:00:00', 5: '6:15:00'}, 'VALUE': {0: 10, 1: 12, 2: 20, 3: 22, 4: 30, 5: 32}})

   id_h        date time_hour  VALUE
0     1  2021-01-01   6:00:00     10
1     1  2021-01-01   6:15:00     12
2     2  2021-01-01   6:00:00     20
3     2  2021-01-01   6:15:00     22
4     3  2021-01-01   6:00:00     30
5     3  2021-01-01   6:15:00     32

使用以下代碼,我可以將其數據粘貼在一起,並且對於每個 id,我每天都有濕度。

humidity_sticked = df_h.pivot(index=["id_h", "date"], columns="time_hour", values="VALUE")
humidity_sticked.columns = [f"value_{i+1}" for i in range(humidity_sticked.shape[1])]
humidity_sticked  =humidity_sticked.reset_index()
As we can see, we have a table with three rows and two columns.

另外,我還有一張顯示溫度的表格。 但是,天氣中心的 id 是不同的。 例如,對於 id_h(濕度的 id)= 1、2,我們只有 id_t(溫度的 id)= 5 所以,我們有完全相同的溫度表,但由於 id 不同,我不能創建與濕度相同的棒表。 這是溫度表:

df_t = pd.DataFrame({'id_t': {0: 5, 1: 5, 2: 5, 3: 5, 4: 7}, 'date': {0: '2021-01-01', 1: '2021-01-01', 2: '2021-01-01', 3: '2021-01-01', 4: '2021-01-01'}, 'time_hour': {0: '6:00:00', 1: '6:15:00', 2: '6:00:00', 3: '6:15:00', 4: '6:00:00'}, 'VALUE': {0: -1, 1: -8, 2: -2, 3: -9, 4: -3}})

   id_t        date time_hour  VALUE
0     5  2021-01-01   6:00:00     -1
1     5  2021-01-01   6:15:00     -8
2     5  2021-01-01   6:00:00     -2
3     5  2021-01-01   6:15:00     -9
4     7  2021-01-01   6:00:00     -3

當我想保留 id_t=5 的值時,出現錯誤。 我想要的期望輸出是: 在此處輸入圖像描述

解釋:對於 id_h=1,2,我們有兩個 5。因此,對於前兩行,我們認為是 1,后兩行是 id=2,最后兩行是 id=3,即 id_t=7。

任何幫助都可以救我!謝謝

更新:我已經使用了索引合並,但是,當我在一個數據框中缺少值時(例如對於特定日期,在 6:00 時我有濕度,但我沒有溫度)。 結果是錯誤的。 這是索引合並的結果,我們可以看到時間不一樣,但它把它們都放在了一行。 在此處輸入圖像描述

df_t['rank'] = df_t.id_t.rank(method='dense')
df_h['rank'] = df_h.id_h.rank(method='dense')
df = df_t.merge(df_h, on=['rank', 'date', 'time_hour'], suffixes=['_1', '_2'])
print(df)

輸出:

   id_t        date time_hour  VALUE_1  rank  id_h  VALUE_2
0     5  2021-01-01   6:00:00       -1   1.0     1       10
1     5  2021-01-01   6:00:00       -2   1.0     1       10
2     5  2021-01-01   6:15:00       -8   1.0     1       12
3     5  2021-01-01   6:15:00       -9   1.0     1       12
4     7  2021-01-01   6:00:00       -3   2.0     2       20

您可以按index使用pd.merge 這種方式是制作“粘貼數據框”的捷徑。

pd.merge(df_t, df_h, left_index=True, right_index=True, suffixes=['_t', '_h'])

輸出:

 id_t      date_t time_hour_t  VALUE_t  id_h      date_h time_hour_h  \
0     5  2021-01-01     6:00:00       -1     1  2021-01-01     6:00:00   
1     5  2021-01-01     6:15:00       -8     1  2021-01-01     6:15:00   
2     5  2021-01-01     6:00:00       -2     2  2021-01-01     6:00:00   
3     5  2021-01-01     6:15:00       -9     2  2021-01-01     6:15:00   
4     7  2021-01-01     6:00:00       -3     3  2021-01-01     6:00:00   

   VALUE_h  
0       10  
1       12  
2       20  
3       22  
4       30  

上面的輸出包含無用的列,因此您可以合並df_tdf_h[only you need to merge] ,如下所示:

pd.merge(df_t, df_h[['id_h','VALUE']], left_index=True, right_index=True, suffixes=['_t', '_h'])

輸出:

   id_t        date time_hour  VALUE_t  id_h  VALUE_h
0     5  2021-01-01   6:00:00       -1     1       10
1     5  2021-01-01   6:15:00       -8     1       12
2     5  2021-01-01   6:00:00       -2     2       20
3     5  2021-01-01   6:15:00       -9     2       22
4     7  2021-01-01   6:00:00       -3     3       30

這是您想要的最簡單的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM