簡體   English   中英

根據單獨數據框中的行和列值對數據框進行切片

[英]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.

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