Python 使用itertuples()打印列中不同的行值(不打印空单元格)

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

我有一张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 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