根据列

时间:2019-08-26 08:31:36

标签: python-3.x pandas dataframe

按评论编辑

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

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

销售前 的另一列,每一行均带有文本。 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(注释/无评论)

 Sales Unnamed: 2  Unnamed: 3  Validation Unnamed: 5 Unnamed: 6
0       Commented  No comment             Commented  No comment                                   
1     0                                            1                        
2                            2          0                                                
3                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新手,我不确定如何将其转换为工作代码。非常感谢您的支持和帮助。

1 个答案:

答案 0 :(得分:1)

这是一种实现方法:

  1. 定义一个替换x的函数:
import re

def replaceX(col):
    cond = ~((col == "x") | (col == "X"))
    # Check if the name of the column is undefined
    if not re.match(r'Unnamed: \d+', col.name):
        return col.where(cond, 0)
    else:
        # 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

或者如果您的第一行的标题列不包含“ Commented”或“ No comment”,则可以使用不带正则表达式的解决方案:

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)
  1. 将此功能应用于DataFrame:
# 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            
  

文档:

     
      
  • Apply:根据轴在每个列/行上应用函数
  •   
  • Where:检查序列中满足条件的地方,如果不满足,请替换为指定的值。
  •