首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas -如何将变量作为列传递到嵌套循环中?

Pandas -如何将变量作为列传递到嵌套循环中?
EN

Stack Overflow用户
提问于 2019-01-06 03:50:00
回答 3查看 249关注 0票数 0

我有一个嵌套循环,我试图将列表中的值传递到该循环中,但它无法识别列表值。如果我用value['OpNo']之类的任何列表值替换value[col],它就可以工作。对于列表值或赋值代码,是否有特定的包装器或我需要的东西?

我尝试了像col_list = ["'OpNo'", "'StationNo'", "'Spindle'", "'OpDescription'"]这样的列表和像value[[col]]这样包装col标注

下面的代码得到以下异常:KeyError: 'OpNo'

代码语言:javascript
运行
复制
row_indexer = 0
col_indexer = 1
iloc_indexer = 0
count_row = operationData.shape[0]
col_list = ['OpNo', 'StationNo', 'Spindle', 'OpDescription']
while row_indexer < count_row:    
    value = operationData.iloc[[row_indexer],[iloc_indexer]]
    for col in col_list:
        value = value[col].values[0]
        wb['OneOpSheet'].cell(row = (row_indexer + 12), column = (col_indexer + 1)).value = value
        col_indexer = (col_indexer + 1)
    row_indexer = (row_indexer + 1)
    iloc_indexer = (iloc_indexer + 1)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-06 04:45:49

我不确定这是否会确切地帮助你,但也许它会让你走上正确的方向。您可以使用Pandas.DataFrame.itertuples()遍历数据帧中的所有行,在需要的时候摘取值。

我更进一步,创建了一个快速的列标签字典来帮助同步嵌套循环。

我试着在必要的地方进行评论,但是如果你不理解什么,请让我知道!

代码语言:javascript
运行
复制
import pandas as pd
import openpyxl
wb = load_workbook(filename='./generic_workbook_name.xlsx')

# Created smoe data for a dataframe.
fake_data_dict = {
    'OpNo':['1','2','3','4',],
    'StationNo':['11','22','33','44',],
    'Spindle':['S1','S2','S3','S4',],
    'OpDescription':['This','is','a','description',]
    }

# Create the dataframe.
data = pd.DataFrame(fake_data_dict)

我们的数据框架:

代码语言:javascript
运行
复制
  OpNo StationNo Spindle OpDescription
0    1        11      S1          This
1    2        22      S2            is
2    3        33      S3             a
3    4        44      S4   description

脚本的其余部分:

代码语言:javascript
运行
复制
col_list = ['OpNo','StationNo','Spindle','OpDescription']


# Create a column label dictionary; Add 1 to index for Excel cells
col_dict = {i+1:v for i, v in enumerate(col_list)}

# Iterate over each row
for idx, row in enumerate(data.itertuples(), start = 1):
    # For each key in our column dictionary [0, 1, 2, 3]
    for key in col_dict.keys():
        print('Row: {a}\n\tColumn: {b}\n\t\tValue: {c}'.format(a = idx, b = key,
                                                               # Reduce the index by 1; Get column name based on key value.
                                                               c = data.loc[idx - 1, col_dict[key]]))

输出:

代码语言:javascript
运行
复制
Row: 1
    Column: 1
        Value: 1
Row: 1
    Column: 2
        Value: 11
Row: 1
    Column: 3
        Value: S1
Row: 1
    Column: 4
        Value: This
Row: 2
    Column: 1
        Value: 2
Row: 2
    Column: 2
        Value: 22
Row: 2
    Column: 3
        Value: S2
Row: 2
    Column: 4
        Value: is
Row: 3
    Column: 1
        Value: 3
Row: 3
    Column: 2
        Value: 33
Row: 3
    Column: 3
        Value: S3
Row: 3
    Column: 4
        Value: a
Row: 4
    Column: 1
        Value: 4
Row: 4
    Column: 2
        Value: 44
Row: 4
    Column: 3
        Value: S4
Row: 4
    Column: 4
        Value: description

考虑到这一点,这可以简化您的脚本:

代码语言:javascript
运行
复制
for idx, row in enumerate(data.itertuples(), start = 1):
    for key in col_dict.keys():
        wb['OneOpSheet'].cell(row = (idx + 11), column = (key + 1)).value = data.loc[idx - 1, col_dict[key]]
票数 2
EN

Stack Overflow用户

发布于 2019-01-06 04:03:48

我认为value = operationData.iloc[[row_indexer],[iloc_indexer]]返回了一个数据帧。试试value = value.loc[col].values[0]

票数 0
EN

Stack Overflow用户

发布于 2019-01-06 05:13:23

我需要将这两个命令都放在for循环中,并在完成后重置两个索引器。下面的嵌套循环完成了我所需要的:

代码语言:javascript
运行
复制
while row_indexer < count_row:    
    for col in col_list:
        value = operationData.iloc[[row_indexer],[iloc_indexer]]
        value = value[col].values[0]
        wb['OneOpSheet'].cell(row = (row_indexer + 12), column = (col_indexer + 2)).value = value
        col_indexer += 1
        iloc_indexer += 1
    row_indexer += 1
    iloc_indexer = 0
    col_indexer = 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54055655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档