我在Python3.5中有以下pandas Dataframe:
import pandas as pd
df = pd.Dataframe(...)
print(df)
输出
string1 string2
'abcdefg...' 'abcSefg...'
'Iknowhow...' 'Eknowhow...'
'Thecatis...' 'Thekatis...'
...
我首先要查找string1
和string2
之间不匹配的位置,然后将其附加到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
如何输出不匹配的字母以对应不匹配的位置?
答案 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
是它的索引,现在可以通过索引进行比较,但只返回相应的字符。