Python 3.x 根据列的不同,将多个无标题列中的值替换为0、1、2

Python 3.x 根据列的不同,将多个无标题列中的值替换为0、1、2,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,根据评论编辑 背景:以下是当前数据帧的外观。行标签是原始excel文件中的信息文本。但我希望这小小的数据复制就足以解决问题了?实际文件大约有100列和200行 列标题和行#0值以如下所示的模式重复-除了Sales或Validation文本在具有现有标题的列的每次出现时发生更改 在销售前再增加一列,每行包含文本。为该测试完成的Xs映射。不幸的是,我们没有找到一种优雅的方式将文本显示为下面输出的一部分 Sales Unnamed: 2 Unnamed: 3 Validation Unnamed

根据评论编辑

背景:以下是当前数据帧的外观。行标签是原始excel文件中的信息文本。但我希望这小小的数据复制就足以解决问题了?实际文件大约有100列和200行

列标题和行#0值以如下所示的模式重复-除了
Sales
Validation
文本在具有现有标题的列的每次出现时发生更改

在销售前再增加一列,每行包含文本。为该测试完成的Xs映射。不幸的是,我们没有找到一种优雅的方式将文本显示为下面输出的一部分

 Sales Unnamed: 2  Unnamed: 3  Validation Unnamed: 5 Unnamed: 6
0       Commented  No comment             Commented  No comment                                   
1     x                                             x                        
2                            x          x                                                
3                x                                             x             
预期输出:将X替换为0、1和2,具体取决于它们所在的列(注释/无注释)

可能的代码:我假设循环看起来像这样:

while in row 9:
    if column value = "commented":

        replace all "x" with 1

    elif row 9 when column valkue = "no comment":

        replace all "x" with 2

    else:

        replace all "x" with 0

但是作为一名python新手,我不知道如何将其转换为工作代码。我非常感谢大家的支持和帮助。

这里有一种方法:

  • 定义替换x的函数:
  • 或者,如果您的第一行不包含标题列的“注释”或“无注释”,则可以使用不带正则表达式的解决方案:

    def replaceX(col):
        cond = ~((col == "x") | (col == "X"))
        # Check what is the value of the first row
        if col.iloc[0] == "Commented":
            return col.where(cond, 1)
        elif col.iloc[0] == "No comment":
            return col.where(cond, 2)
        return col.where(cond, 0)
    
  • 在数据帧上应用此函数:
  • 输出:

      title Unnamed: 2  Unnamed: 3
    0        Commented  No comment
    1                             
    2     0                      2
    3                1            
    
    文件:

    • :根据轴对每列/每行应用函数
    • :检查序列上满足条件的位置,如果不满足,则替换为指定的值

    亲爱的@Erfan,感谢您的评论。我不熟悉蟒蛇、熊猫等。不知道如何使用Xs(图1)作为可复制粘贴数据重新创建映射DF。我可以想象,对于具有唯一文本字符串和标题列的数据来说,这会更容易。以前我被鼓励分享我的DF图像,我在这里使用了相同的方法。如果有更好的方法,我很乐意学习。要问一个好问题,请在@Erfan提供的链接中进行解释,基本上是使用head或/和tail或/和sample给出数据帧的示例,具体取决于数据帧的结构(有时所有行看起来都一样,有时有某种顺序)。然后你可以把它打印出来,复制到stackoverflow上,这样我们就可以使用它了。此外,您还应该打印您作为输入提供的特定数据帧的预期输出,以供人们查看他们是否给您带来了良好的结果。如果在
    pd.DataFrame()
    中,您放置了我们可以复制粘贴的数据,我们就可以复制它,但您应该将它作为一个表显示在stackoverflow上,以便我们看到它。我们的想法是,是否像这样打印(df.to_string())并将输出复制粘贴到堆栈溢出上,或者如果在本地运行,则运行
    df.to_clipboard()
    并将其粘贴到堆栈溢出上(它会自动复制df以便您可以粘贴它)。然后我们可以通过
    pd.read_clipboard()
    复制它,或者如果您也给了我们
    pd.DataFrame(data)
    只需运行您的代码即可。@SmileyProd,我不知道可以将粘贴输出复制到此处提出的问题。谢谢你和我的宝贵意见。我会试试看如何把这个添加到问题中,并相应地修改。@Erfan,现在修改好了吗?效果非常好!非常感谢。还有一个问题:如何编辑代码,使其同时适用于小写和大写
    Xs
    ?我尝试使用
    命令,还简单地添加了另一个return语句,但都不起作用。我更新了答案,还直接创建了一个cond变量,使代码更易于阅读。我尝试了代码。给我一个错误:
    (“序列的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all(),“发生在索引规范编号处”)
    @mvx我也首先使用了
    而不是
    ,现在它是固定的,应该可以正常工作:)是的,它工作得很好。非常感谢您的努力!:)
    def replaceX(col):
        cond = ~((col == "x") | (col == "X"))
        # Check what is the value of the first row
        if col.iloc[0] == "Commented":
            return col.where(cond, 1)
        elif col.iloc[0] == "No comment":
            return col.where(cond, 2)
        return col.where(cond, 0)
    
    # Apply the function on every column (axis not specified so equal 0)
    df.apply(lambda col: replaceX(col))
    
      title Unnamed: 2  Unnamed: 3
    0        Commented  No comment
    1                             
    2     0                      2
    3                1