Python 迭代列、查找所选内容、创建新列

Python 迭代列、查找所选内容、创建新列,python,string,pandas,for-loop,Python,String,Pandas,For Loop,我正在尝试浏览一个网站的网页,并创建一个名称和图像链接的数据框。 但是,在解析名称时存在一些问题 我的数据框看起来像这样 color gender model1 model2 extra_col1 extra_col2 extra_col3 black male A24 B2 red woman A1 B3 19sf black male A22 B1 d

我正在尝试浏览一个网站的网页,并创建一个名称和图像链接的数据框。 但是,在解析名称时存在一些问题

我的数据框看起来像这样

color    gender    model1    model2  extra_col1  extra_col2    extra_col3
black    male       A24      B2       
red      woman      A1       B3
19sf     black      male     A22        B1
deep     1909sf     2202     blue       woman         A1          B22   
前两行是正确的。我想迭代这7列,找到正确的颜色、性别和型号,并创建新的列

下表最后是我想要的

color    gender    model1    model2     
black    male       A24      B2                                           
red      woman      A1       B3
black    male       A22      B1
blue     woman      A1       B22
我有颜色、性别、型号1、型号2的独特值列表 我需要比较特定列中的每个元素,与列表匹配,并在颜色列、性别列等中写入正确的元素


谢谢。

嗯,它肯定不干净。一个
Python
pro肯定会引起他们的关注,但由于我是
Python
Pandas
新手,我只是尝试使用一些
Join
正则表达式和
Split

import pandas as pd
df = pd.DataFrame({'color':['black','red','19sf','deep'],
                   'gender':['male','woman','black','1909sf'],
                   'model1':['A24','A1','Male','2202'],
                   'model2':['B2','B3','A22','blue'],
                   'extra_col1':['','','B1','woman'],
                   'extra_col2':['','','','A1'],
                   'extra_col3':['','','','B22']})
df = df[df.columns[0:]].apply(lambda x: '|'.join(x.dropna().astype(str)), axis=1)
df = df.replace(r'.*?((?:\w+\|){3}\w+(?=\|*$)).*', value = r'\1', regex = True)
df = df.str.split('|', expand = True)
df.columns = ['color','gender','model1','model2']
print(df)

同样,虽然我对在
VBA
之外编程非常陌生,但这可以完成工作,但可能会做得更整洁。祈祷它对你有用=)

好吧,它绝对不干净。一个
Python
pro肯定会引起他们的关注,但由于我是
Python
Pandas
新手,我只是尝试使用一些
Join
正则表达式和
Split

import pandas as pd
df = pd.DataFrame({'color':['black','red','19sf','deep'],
                   'gender':['male','woman','black','1909sf'],
                   'model1':['A24','A1','Male','2202'],
                   'model2':['B2','B3','A22','blue'],
                   'extra_col1':['','','B1','woman'],
                   'extra_col2':['','','','A1'],
                   'extra_col3':['','','','B22']})
df = df[df.columns[0:]].apply(lambda x: '|'.join(x.dropna().astype(str)), axis=1)
df = df.replace(r'.*?((?:\w+\|){3}\w+(?=\|*$)).*', value = r'\1', regex = True)
df = df.str.split('|', expand = True)
df.columns = ['color','gender','model1','model2']
print(df)

同样,虽然我对在
VBA
之外编程非常陌生,但这可以完成工作,但可能会做得更整洁。祝你好运它对你有用=)

在将数据放入数据框之前,你能添加一个数据外观的片段吗?在我看来(根据你的示例),你希望总是以最后4列结束吗?我说的对吗?您正在尝试在提供数据帧之后修复数据,而修复提供数据帧的方式会更好。确实可以修复数据帧本身,但您必须使用可能更糟糕的技术,而修复原始数据肯定要好得多。@jvdV是的,您是对的。@Serge Ballesta它是一个html对象,因此通常应该有4个元素,如post中最后一个表中的元素。我想最好一劳永逸地完成这个操作,否则在我刮取数据时,我需要检查for循环中的每个元素,我不喜欢这些元素。在将数据放入数据帧之前,您可以添加一个数据外观的片段吗?在我看来(根据您的示例),您希望始终以最后4列结束吗?我说的对吗?您正在尝试在提供数据帧之后修复数据,而修复提供数据帧的方式会更好。确实可以修复数据帧本身,但您必须使用可能更糟糕的技术,而修复原始数据肯定要好得多。@jvdV是的,您是对的。@Serge Ballesta它是一个html对象,因此通常应该有4个元素,如post中最后一个表中的元素。我想最好一劳永逸地完成这个操作,否则,当我刮擦时,我需要检查循环中的每个元素,我不希望有任何运气@谢谢你的回答!它适用于给定的数据集,但我需要更通用的解决方案,如在列中匹配颜色列表。例如,应该在所有列中搜索“black”,并写入给定行的color列。这就是为什么我事先问您是否总是需要获取最后4个非空值,您说的是正确的@泰尔。我现在已经没有主意了。祝你好运。我把“最后4列”理解为最后一个有问题的表格。无论如何,谢谢:)@Tyr,除非您使用源数据解决这个问题,否则我认为任何编程语言都很难知道在哪里搜索什么值以及将其放在哪里。若在第一列中找不到有效值,那个么您希望代码如何理解搜索黑色或任何其他颜色并将其放入第1列?如果有人能想出更普遍的方法,那会很有趣。运气好吗@谢谢你的回答!它适用于给定的数据集,但我需要更通用的解决方案,如在列中匹配颜色列表。例如,应该在所有列中搜索“black”,并写入给定行的color列。这就是为什么我事先问您是否总是需要获取最后4个非空值,您说的是正确的@泰尔。我现在已经没有主意了。祝你好运。我把“最后4列”理解为最后一个有问题的表格。无论如何,谢谢:)@Tyr,除非您使用源数据解决这个问题,否则我认为任何编程语言都很难知道在哪里搜索什么值以及将其放在哪里。若在第一列中找不到有效值,那个么您希望代码如何理解搜索黑色或任何其他颜色并将其放入第1列?如果有人能想出更一般化的方法,我会很感兴趣。