如何通过匹配熊猫数据框中的字符串来使用索引

时间:2020-04-15 16:56:35

标签: pandas indexing mapping

我尝试解决以下问题。我有两个数据集,例如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

有什么想法可以高效而优雅地做到吗?

感谢帮助!

1 个答案:

答案 0 :(得分:1)

第一个问题

df2.set_index('NameSP')['Val1'].reindex(df1['NameSP']).fillna(0)

第二个问题

df1['Val1'].where(df1['NameSP'].isin(df2['NameSP']), 0)