我尝试解决以下问题。我有两个数据集,例如df1和df2:
df1
NameSP Val Char1 BVA
0 'ACCR' 0.091941 A Y'
1 'SDRE' 0.001395 S Y'
2 'ACUZ' 0.121183 A N'
3 'SRRE' 0.001512 S N'
4 'FFTR' 0.035609 F N'
5 'STZE' 0.000637 S N'
6 'AHZR' 0.001418 A Y'
7 'DEES' 0.000876 D N'
8 'UURR' 0.023878 U Y'
9 'LLOH' 0.004371 L Y'
10 'IUUT' 0.049102 I N'
df2
NameSP Val1 Glob
0 'ACCR' 0.234 20000
1 'FFTR' 0.222 10000
2 'STZE' 0.001 5000
3 'DEES' 0.006 2000
4 'UURR' 0.134 20000
5 'LLOH' 0.034 10000
我想在df1中对df2进行索引,然后将索引向量用于各种矩阵运算。这将类似于Matlab中的strmatch(A,B,'exact')。我可以使用.iloc和.isin正确获得索引,如以下代码所示:
import pandas as pd
import numpy as np
df1 = pd.read_excel('C:\PYTHONCODES\LINEAROPT\TEST_DATA1.xlsx')
df2 = pd.read_excel('C:\PYTHONCODES\LINEAROPT\TEST_DATA2.xlsx')
print(df1)
print(df2)
ddf1 = df1.iloc[:,0]
ddf2 = df2.iloc[:,0]
pindex = ddf1[ddf1.isin(ddf2)]
print(pindex.index)
这给了我
Int64Index([0, 4, 5, 7, 8, 9], dtype='int64')
但是我找不到使用该索引映射和构建数组的方法。例如,我希望有一个向量,该向量具有与df1相同的元素数,但是在索引位置处具有df2的Val1值,而在其他位置处为零。所以它应该像这样:
0.234
0
0
0
0.222
0.001
0
0.006
0.134
0.034
0
或另一个映射问题。如何使用此类索引将df1中冒号“ Val”中的值映射到向量中,该向量将在索引行中包含df1中的Val,而在其他任何地方都包含零。所以这次看起来应该像这样:
0.091941
0.0
0.0
0.0
0.035609
0.000637
0.0
0.000876
0.023878
0.004371
0.0
有什么想法可以高效而优雅地做到吗?
感谢帮助!
答案 0 :(得分:1)
第一个问题
df2.set_index('NameSP')['Val1'].reindex(df1['NameSP']).fillna(0)
第二个问题
df1['Val1'].where(df1['NameSP'].isin(df2['NameSP']), 0)