在pandas中使用iterrows来查找字符串之间的不匹配,bug

时间:2016-04-20 20:05:37

标签: python python-3.x pandas dataframe iteration

我在Python3.5中有以下pandas Dataframe:

import pandas as pd
df = pd.Dataframe(...)
print(df)

输出

string1        string2
'abcdefg...'   'abcSefg...'
'Iknowhow...'  'Eknowhow...'
'Thecatis...'  'Thekatis...'
...

我首先要查找string1string2之间不匹配的位置,然后将其附加到Dataframe df。我使用这段代码:

df["different_positions"] = [[i for i in range(len(row.string2)) 
    if row.string1[i] != row.string2[i]] for _, row in df.iterrows()]
那会让我所有的职位都出现不匹配。现在,我想要一个单独的列,输出不匹配的每个字母。例如,在string2中,第一行中有S而不是d,第二行中有E而不是I,等等。

我认为代码是

df["different_letters"] = [[i for i in row.string2
    if row.string1[i] != row.string2[i]] for _, row in df.iterrows()]

但是,看起来这并不正确。我在NameError获得for _, row,即

NameError: name 'i' is not defined

如何输出不匹配的字母以对应不匹配的位置?

1 个答案:

答案 0 :(得分:1)

字符串迭代返回字符,而不是索引。换句话说,i for i in row.string2将通过row.string2字符,而不是相应的索引。

所以

df["different_letters"] = [[i for i in row.string2
if row.string1[i] != row.string2[i]] for _, row in df.iterrows()]

不正确,因为如果row.string1['a']包含row.string1,您有效地询问a是什么。字符串索引必须是整数。

相反,你想做

df["different_letters"] = [[j for i, j in enumerate(row.string2)
if row.string1[i] != row.string2[i]] for _, row in df.iterrows()]

enumerate允许您遍历索引迭代中的相应元素。这里,j是对应的字符,i是它的索引,现在可以通过索引进行比较,但只返回相应的字符。