Python 使用itertuples()打印列中不同的行值(不打印空单元格)
我有一张excel表格,其中包含以下内容:Python 使用itertuples()打印列中不同的行值(不打印空单元格),python,pandas,Python,Pandas,我有一张excel表格,其中包含以下内容: key topic a b c d e plants flower red blue green pink purple space moon grey blue white bugs ants red black 简而言之,我想要的是将每一行“打印”成单独的文件,如下所示: file1.txt: a) It is red. b) It is bl
key topic a b c d e
plants flower red blue green pink purple
space moon grey blue white
bugs ants red black
简而言之,我想要的是将每一行“打印”成单独的文件,如下所示:
file1.txt:
a) It is red.
b) It is blue.
c) It is green.
d) It is pink.
e) It is purple.
file2.txt:
a) It is grey.
b) It is blue.
c) It is white.
file3.txt:
a) It is red.
b) It is black.
但正如您所看到的,每一行包含不同数量的列。也就是说,有我不想打印出来的空单元格
我不想要这样的文件:
a) It is red.
b) It is black.
c)
d)
e)
这是我目前的代码:
df.itertuples()中的行的:
ques=打开(“file1.txt”,“w+”)
ques.write('它是'+row.a+'))
ques.write('它是'+row.b+'))
ques.write('它是'+row.c+'))
ques.write('它是'+row.d+'))
ques.write('它是'+row.e+'))
然后抛出一个错误TypeError:只能将str(而不是“float”)连接到str
。我几乎可以肯定,这是因为第二和第三个问题在d、e和c、d、e列中没有任何内容
(是的,我知道这段代码会重复打印到同一个file1.txt,但我已经简化了代码,将重点放在我的主要问题上,即行的列数不一样。)
于是我试着:
for index in df.itertuples():
ques.write(row.index)
我得到这个错误:TypeError:只能将str(而不是“内置函数”或“方法”)连接到str
我也试过:
if row.c is not None:
ques.write('It is '+row.c+'.')
if row.d is not 0:
ques.write('It is '+row.d+'.')
# etc
这也会抛出一个错误
我知道我必须使用一个循环,但在四处搜索之后,我有点不知所措。我的主要问题是我不想把空单元格打印出来
任何帮助都将不胜感激
编辑:
我尝试了
ques.write(','.join(如果我不是np.NaN,那么第[1:]行中的I代表I))
虽然这可以避免抛出错误,但现在它将所有内容打印到一行中。植物,花,红,蓝,绿,粉红,紫色 尝试键入并将其转换为字符串
在
您可以逐行解析文件,只需打印第二列之后的所有内容:
with open(filename, "r") as f:
headers = next(f).split()
count = 1
for line in f:
line = line.split()
with open(f"file{count}.txt", "w") as outf:
outf.write("\n".join(line[2:]))
count += 1
<>编辑:如果您的输入文件在中间可以有空列(例如最后一行):
它不起作用,因此,如果您有这样的情况,请告诉我,我将进行编辑。我通过这样做解决了问题:
如果row.c不是np.NaN:
ques.write('它是'+row.c+'))
如果d行不是np.NaN:
ques.write('它是'+row.d+'))
如果e行不是np.NaN:
ques.write('它是'+row.e+'))
它不是一个真正的循环,所以不能按比例放大,但在其他方面它是有效的。感谢Henry Yik在np.NaN的评论,问题是,我不希望它打印空单元格。我对我的问题进行了编辑,以便更清楚地说明这一点。
df=temp_df.copy()df=df.drop(columns=['key','topic'],axis=“columns”)用于df.itertuples()中的行:#打印(row)用于行中的x:if isinstance(x,str):打印(x,键入(x))
请参阅此部分仅打印每行的非空单元格。temp_df:您从文件加载的初始数据帧您能将其编辑到您的答案中吗?在评论中读起来有点难。不过我会试试这个。你想在输出文件中使用列标题(a、b、c d)吗?不,没关系。你能不能先调整行,即ques.write([I为I,如果I不是None])
?@HenryYik我不太清楚你的意思。这难道不会打印出这一行中的所有内容,包括开头的“植物、花”之类的内容吗?我只想打印出a,b,c,d,e的值,如果它们不是空的话。我不能猜出你面临的所有错误。其思想是通过列表理解过滤掉不需要的数据,加入列表并写入文件。如果没有一个是不正确的,可以使用np.NaN。我可以试试这个,但理想情况下我想使用itertuples(),因为我的其余代码都依赖于它。
with open(filename, "r") as f:
headers = next(f).split()
count = 1
for line in f:
line = line.split()
with open(f"file{count}.txt", "w") as outf:
outf.write("\n".join(line[2:]))
count += 1
key topic a b c d e
plants flower red blue green pink purple
space moon grey blue white
bugs ants red black
food pasta blue pink purple green