按评论编辑
背景:这是当前数据框的外观。行标签是原始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(注释/无评论)
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新手,我不确定如何将其转换为工作代码。非常感谢您的支持和帮助。
答案 0 :(得分:1)
这是一种实现方法:
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)
# 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
文档: