我想使用循环,根据熊猫中的字符串匹配,对不同列中的行值进行重新编码。我找到了一种方法,每次创建一个全新的列即可,但是当我需要修改分析中不同点的多个列中的选择行时,该方法不起作用。
这是我与示例数据框一起使用的解决方案:
iris = sns.load_dataset('iris')
iris.head()
iris.species.value_counts()
pattern = ['setosa', 'virginica']
iris['new_column'] = 0
lis = []
for index, row in iris.iterrows():
#print (row['species'])
if any(ele in row.species for ele in pattern):
lis.append('matched')
else:
lis.append("notmatched")
iris['new_column'] = lis
我知道在Pandas中可能还有其他方法可以通过列表理解或使用lambda / apply方法,但是我正在请求使用循环的解决方案。 (我这里没有完整的数据集,但是有一些复杂性,我相信循环可能是最灵活的)。
关于如何使用循环和字符串匹配来修改另一列中的行的任何建议?谢谢,让我知道是否可以改善这个问题!
答案 0 :(得分:0)
最简单的循环解决方案之一是按列iris['species']
的每个值进行迭代,并按条件lis
追加到列表in
:
pattern = ['setosa', 'virginica']
lis = []
for val in iris['species']:
if val in pattern:
lis.append('matched')
else:
lis.append("notmatched")
iris['new_column'] = lis
numpy.where
和Series.isin
可以实现熊猫解决方案:
iris['new_column'] = np.where(iris['species'].isin(pattern), 'matched', 'notmatched')
答案 1 :(得分:0)
我最终通过几个不同的线索找到了答案。
这是我的做法
iris = sns.load_dataset('iris')
iris.head()
print (iris.species.value_counts())
pattern = ['setosa', 'virginica']
iris['new_column'] = 0
for index, row in iris.iterrows():
match = re.match('|'.join(pattern), row.species)
if match:
iris.loc[index, "new_column"] = match.group(0)
else:
iris.loc[index, "new_column"] = 'no match'
print (iris.new_column.value_counts())
我想有一种更有效的方法来执行此操作,而且我还必须指定列,这并不理想。随时发表评论!