[英]slicing a dataframe based on row and column values within a seperate dataframe
問題是查找值矩陣,其中索引和行標識符存儲在單獨的數據框中,並將此值映射到新列。
目前我有與風速和風向有關的值的查找矩陣,其中行列名稱是方向度,索引是速度值:
value_df:
0 2 4
0 9.7 5.6 4.0
0.1 9.8 5.7 4.1
0.2 7.1 3.6 4.4
0.3 1.1 1.2 0.9
0.4 4.1 3.3 7.5
0.5 4.3 5.8 3.6
0.6 0.6 0.7 9.8
0.7 5.4 0.1 5.4
0.8 7.0 7.4 4.0
0.9 7.9 6.6 8.9
1.0 8.9 7.6 7.4
我有一個很大的時間序列:
met_data_df:
DateTime Speed Direction
1999-01-01 00:00:00 0.2 0
1999-01-01 01:00:00 0.3 4
1999-01-01 02:00:00 0.5 2
1999-01-01 03:00:00 1.0 4
1999-01-01 04:00:00 0 4
... ... ...
1999-11-02 11:00:00 0.4 0
1999-11-02 12:00:00 0.9 0
1999-11-02 13:00:00 0.7 0
1999-11-02 14:00:00 0.4 2
1999-11-02 15:00:00 0.3 4
我想要做的是將第一個矩陣映射到第二個矩陣,其中根據速度與索引和方向值與行標簽選擇值。
DateTime Speed Direction Value
1999-01-01 00:00:00 0.2 0 7.1
1999-01-01 01:00:00 0.3 4 0.9
1999-01-01 02:00:00 0.5 2 5.8
1999-01-01 03:00:00 1.0 4 7.4
1999-01-01 04:00:00 0 4 ...
... ... ... ...
1999-11-02 11:00:00 0.4 0
1999-11-02 12:00:00 0.9 0
1999-11-02 13:00:00 0.7 0
1999-11-02 14:00:00 0.4 2
1999-11-02 15:00:00 0.3 4
我試圖構建一個 lambda 函數,並嘗試在多列上進行合並,但是我只能根據風速映射整行。
met_data_df.merge(value_df,left_on='Speed',right_index=True)
您需要做兩件事: 融化value_df
,然后將其與met_data_df
合並
import pandas as pd
value_df = pd.DataFrame({0: [0, 1, 2, 4],
2: [4, 5, 6, 7],
4: [8, 9, 10, 11]},
index=[0, 0.1, 0.2, 0.3])
met_data_df = pd.DataFrame({'DateTime': [0, 1, 2, 3],
'Speed': [0.2, 0.3, 0.1, 0.4],
'Direction': [0, 4, 2, 4]})
value_melted = (value_df.reset_index()
.melt(id_vars='index'))
value_melted.columns = ['Speed', 'Direction', 'value']
pd.merge(met_data_df, value_melted, on=['Speed', 'Direction'], how='left')
您需要保證df
中的索引和列名與df2
速度/方向列兼容類型......所以如果速度/方向在df2
是數字,那么確保它們在df
也是數字......(例如:你可能需要df.columns = pd.to_numeric(df.columns)
等...)
但是,您應該可以在此處使用DataFrame.lookup
:
df2['Value'] = df.lookup(df2['Speed'], df2['Direction'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.