【问题标题】:Enumerate in 'for' function在“for”函数中枚举
【发布时间】:2021-04-28 19:29:26
【问题描述】:

我想在每个 .tsv 文件中添加一个名为 X 的列。我希望此列具有 folder_names 列表中相应索引的值(每个 .tsv 文件的 folder_names 的一个值)。但是enumerate 函数在for loop 的每次迭代中都会重复,因此“X”列总是得到names 的最后一个值,而不是对应的。

我得到了这两个列表:

all_files_tsv = [tsv_file_1, tsv_file_2.... tsv_file_n]

folder_names = [folder_name_1, folder_name_2.... folder_name_n]

所需的输出如下:

tsv_file_1:

Column1 Column2 X
1 A folder_name_1
2 B folder_name_1
3 C folder_name_1

tsv_file_2:

Column1 Column2 X
1 --- folder_name_2
2 --- folder_name_2
3 --- folder_name_2

这是我现在拥有的代码:

for file_ in all_files_tsv:
    df = pd.read_csv(file_,sep = '\t', header=0)
    for index, names in enumerate(folder_names):
        df['X'] = names

知道我该如何解决这个问题吗?

【问题讨论】:

  • 我对 pandas 不是很熟悉,但你可能想做df['X'][index] = names 之类的东西吗?或者也许反过来?
  • folder_names 是普通列表吗?您希望所有列都具有相同的值吗?
  • 你没有使用index,那你为什么使用enumerate()

标签: python pandas dataframe enumerate


【解决方案1】:

您不需要enumerate()。您可以使用zip() 并行迭代all_files_tsvfolder_names 以获取相应的元素。

for file, name in zip(all_files_tsv, folder_names):
    df = pd.read_csv(file, sep='\t', header=0)
    df['X'] = name
    df.to_csv(file, sep='\t', header=0)

当你想要两个列表之间的叉积时使用嵌套循环,当你想要配对对应的元素时使用zip()

【讨论】:

  • 我正在写一个答案,但这更好。看来 OP 是新的,所以为了完整起见,请允许我补充一下,这相当于 for index, file_ in enumerate(all_files_tsv): df = pd.read_csv(file_,sep = '\t', header=0); df['X'] = folder_names[index]
  • 对,他列举了错误的列表。
猜你喜欢
  • 2023-03-30
  • 2011-08-20
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多