我有2个数据框,两个相同的长度但尺寸不同。
本质上,我想通过将df1 ['data1']中的值作为列输入选择Ref_df中的值。
下面,您可以看到我的解决方案,但是有没有办法无需使用.ix还是不使用循环?另外,如果我的索引是DateTime索引而不是[11','12','13','14']?
,我该怎么办? import pandas as pd
import numpy as np
data = {'21' : [1,2,3,4], '22' : [5,6,7,8], '23' : [9,10,11,12], '24' : [13,14,15,16]}
ref_df = pd.DataFrame(data, index=['11','12','13','14'])
df1 = pd.DataFrame({'Data': ['11','12','13','14'],'Data1': ['21','22','23','24']})
for index, row in df1.iterrows():
df1.ix[index, 'Derived'] = ref_df.iloc[ref_df.index.get_loc(row.Data), ref_df.columns.get_loc(row.Data1)]
df1 Data Data1
0 11 21
1 12 22
2 13 23
3 14 24
-----------
ref df 21 22 23 24
11 1 5 9 13
12 2 6 10 14
13 3 7 11 15
14 4 8 12 16
---------
df1 Data Data1 Derived
0 11 21 1.0
1 12 22 6.0
2 13 23 11.0
3 14 24 16.0
----------
如果df1
的columns
按照ref_df
index
和columns
为顺序,则可以将ref_df
的对角线值呈:
df1['Derived'] = np.diag(ref_df)
print(df1)
Data Data1 Derived
0 11 21 1
1 12 22 6
2 13 23 11
3 14 24 16
如果不对齐,则根据df1
更改ref_df
中的顺序。
或直接使用lookup
:
df1['Derived'] = ref_df.lookup(df1['Data'], df1['Data1'])