我需要在熊猫中创建一个函数,该函数将单个数据框作为输入,并根据特定条件返回多个数据框作为输出。 (请检查下面的示例以了解情况)。我很难弄清楚如何做。我需要一些专家的编码建议。
示例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列)
这是我要开发的逻辑:
我尝试了以下代码,但这是错误的。在下面的代码中,我尝试基于拆分百分比获取受尊重的列号,稍后我计划使用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)
任何人都可以帮助我解决这个逻辑是否正确以及如何实现吗?
答案 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等),值是从数据框中选择的列。