如何在熊猫的for循环迭代中创建多个数据框?

时间:2019-11-01 09:57:08

标签: python pandas dataframe

我需要在熊猫中创建一个函数,该函数将单个数据框作为输入,并根据特定条件返回多个数据框作为输出。 (请检查下面的示例以了解情况)。我很难弄清楚如何做。我需要一些专家的编码建议。

示例1:

输入 =具有100列的数据框

输出 =数据帧1的前10%列(第1至10列),数据帧2的后10%列(第11至20列),依此类推,直到最后10%的列(第91列至第90列) 100)。

示例2:

输入 = 109列的数据帧

输出 =数据帧1的列的前10%(四舍五入)(第1到11列),数据帧2的列的第二10%(第12至23列),依此类推,直到最后10%列(109列)

这是我要开发的逻辑:

  1. 从原始数据帧中列的总数中找到10%的值为'n'
  2. 从原始数据框中选择前“ n”列。
  3. 将它们添加到新的数据框中
  4. 从原始数据框中删除它们
  5. 检查原始数据框中的列总数是否大于'n'
  6. 如果否->重复步骤2至步骤5。
  7. 如果是->将所有剩余的列添加到最后创建的列 数据框。

我尝试了以下代码,但这是错误的。在下面的代码中,我尝试基于拆分百分比获取受尊重的列号,稍后我计划使用iloc函数使用这些数字拆分数据帧。

def split_column_numbers(total_columns, percentage_split):
    list1 = []
    number = round((total_columns * (percentage_split/100)))
    list1.append([0,number])
    for i in range(number):
        last_num = list1[-1][-1]
        if (last_num < total_columns):
            if((total_columns-last_num) > number):
                list1.append([last_num+1, last_num+number])
            else:
                list1.append([last_num+1, total_columns])
    return list1
split_column_numbers(101, 10)

任何人都可以帮助我解决这个逻辑是否正确以及如何实现吗?

1 个答案:

答案 0 :(得分:1)

如果直接将框架传递给该函数,则应该可以更轻松地确定以后要抓取的列。我们可以使用math.ceil进行四舍五入,并使用itertools.zip_longest进行分组。

from itertools import zip_longest
from math import ceil


def split_columns(frame, percentage_split):
    cols = frame.columns
    grp_size = ceil(len(cols) * percentage_split/100)
    return [[c for c in grp if c] for grp in zip_longest(*(iter(cols),) * grp_size)]

例如,如果我们按如下所示设置虚拟框架:

from string import ascii_lowercase

import pandas as pd

tmp = pd.DataFrame(columns=list(ascii_lowercase))

然后,如果我们进行split_columns(tmp, 10),我们将得到:

[['a', 'b', 'c'],
 ['d', 'e', 'f'],
 ['g', 'h', 'i'],
 ['j', 'k', 'l'],
 ['m', 'n', 'o'],
 ['p', 'q', 'r'],
 ['s', 't', 'u'],
 ['v', 'w', 'x'],
 ['y', 'z']]

如果我们进行split_columns(tmp, 30),我们将得到:

[['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
 ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'],
 ['q', 'r', 's', 't', 'u', 'v', 'w', 'x'],
 ['y', 'z']]

如果我们随后要使用这些列选择来创建新框架,则可以使用字典理解和enumerate

frames = {i: tmp[cols] for i, cols in enumerate(split_columns(tmp, 30))}

这为我们提供了一个字典,其中的键是整数(第一组列对应于0,第二组对应于1等),值是从数据框中选择的列。