我嘗試通過映射兩個維度(列)&來創建一個新列X2。所以這是一種基于兩個條件的查找。到目前為止,我只知道如何基于一維進行映射。DataFrame df2DatesIDdf1
df1:
01K 02K 03K 04K
Dates
2021-01-01 4.2 3.5 4.2 NaN
2021-01-02 2.3 0.1 5.2 2.6
2021-01-03 0.3 NaN 2.5 8.2
2021-01-04 0.4 NaN 3.0 4.2
df2:
ID X1
Dates
2021-01-01 01K 3.5
2021-01-01 02K 1.1
2021-01-02 02K 2.1
2021-01-03 03K 4.2
2021-01-03 04K 3.1
2021-01-04 04K 2.7
df2_new:
ID X1 X2
Dates
2021-01-01 01K 3.5 4.2
2021-01-01 02K 1.1 3.5
2021-01-02 02K 2.1 0.1
2021-01-03 03K 4.2 2.5
2021-01-03 04K 3.1 8.2
2021-01-04 04K 2.7 4.2
為了重現性:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K':[4.2, 2.3, 0.3, 0.4],
'02K':[3.5, 0.1, 'NaN', 'NaN'],
'03K':[4.2, 5.2, 2.5, 3.0],
'04K':['NaN', 2.6, 8.2, 4.2]})
df1 = df1.replace('NaN',np.nan)
df1 = df1.set_index('Dates')
df2 = pd.DataFrame({
'Dates':['2021-01-01', '2021-01-01', '2021-01-02', '2021-01-03', '2021-01-03', '2021-01-04'],
'ID':['01K', '02K', '02K', '03K', '04K', '04K'],
'X1':[3.5, 1.1, 2.1, 4.2, 3.1, 2.7]})
df2 = df2.set_index('Dates')
非常感謝!
uj5u.com熱心網友回復:
您可以meltdf1 將其重塑為長格式,并merge在“日期”和“ID”上將輸出留給 df2:
df1_melt = df1.reset_index().melt(id_vars='Dates', var_name='ID', value_name='X2')
df2.merge(df1_melt, on=['Dates', 'ID'], how='left').set_index('Dates')
輸出:
ID X1 X2
Dates
2021-01-01 01K 3.5 4.2
2021-01-01 02K 1.1 3.5
2021-01-02 02K 2.1 0.1
2021-01-03 03K 4.2 2.5
2021-01-03 04K 3.1 8.2
2021-01-04 04K 2.7 4.2
uj5u.com熱心網友回復:
給定資料幀,
df1 = pd.DataFrame({
'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K':[4.2, 2.3, 0.3, 0.4],
'02K':[3.5, 0.1, 'NaN', 'NaN'],
'03K':[4.2, 5.2, 2.5, 3.0],
'04K':['NaN', 2.6, 8.2, 4.2]})
df2 = pd.DataFrame({
'Dates':['2021-01-01', '2021-01-01', '2021-01-02', '2021-01-03', '2021-01-03', '2021-01-04'],
'ID':['01K', '02K', '02K', '03K', '04K', '04K'],
'X1':[3.5, 1.1, 2.1, 4.2, 3.1, 2.7]})
我們可以將df1' 的索引設定為Dates并簡單地按索引和列查找相應的值:
df1 = df1.set_index('Dates')
df1 = df1.replace('NaN',np.nan)
df['X2'] = df2.apply(lambda x: df1.loc[x['Dates'], x['ID']], axis=1)
另一種選擇是unstack df1創建一個系列。然后set_index到df2并作為 MultiIndexDates并ID使用該 MultiIndex 過濾來自未堆疊系列的相關資料:
df1_data = df1.unstack().swaplevel(1,0)
df['X2'] = df1_data[df2.set_index(['Dates','ID']).index].to_numpy()
輸出:
A B C X2
0 a 1 2 4.2
1 b 3 4 3.5
2 c 5 6 0.1
3 a 1 2 2.5
4 b 3 4 8.2
5 c 5 6 4.2
uj5u.com熱心網友回復:
您可以使用 melt ,而無需使用 index :
df1_melt = df1.melt(var_name='ID', value_name='X2', ignore_index=False)
df2.merge(df1_melt, on=['Dates', 'ID'], how='left')
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412469.html
標籤:
