根据字符串值在Python中基于字符串值修改新列中的行值

时间:2020-07-08 06:14:02

标签: python pandas

我想使用循环,根据熊猫中的字符串匹配,对不同列中的行值进行重新编码。我找到了一种方法,每次创建一个全新的列即可,但是当我需要修改分析中不同点的多个列中的选择行时,该方法不起作用。

这是我与示例数据框一起使用的解决方案:

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方法,但是我正在请求使用循环的解决方案。 (我这里没有完整的数据集,但是有一些复杂性,我相信循环可能是最灵活的)。

关于如何使用循环和字符串匹配来修改另一列中的行的任何建议?谢谢,让我知道是否可以改善这个问题!

2 个答案:

答案 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.whereSeries.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())

我想有一种更有效的方法来执行此操作,而且我还必须指定列,这并不理想。随时发表评论!