![](/img/trans.png)
[英]How can I subset a data frame for unique rows using repeating values from a column in another data frame in python?
[英]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_t
和df_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.