我需要在熊猫中创建一个函数,该函数将单个数据框作为输入,并根据特定条件返回多个数据框作为输出。 (请检查下面的示例以了解情况)。我很难弄清楚如何做。我需要一些专家的编码建议。
范例1:
输入= 100列的数据框
输出=数据帧1的前10%列(第1到10列),数据帧2的后10%列(第11到20列),依此类推,直到最后10%的列(第91到100列)。
范例2:
输入= 109列的数据框
输出=列的前10%的dataframe1(四舍五入)(第1到11列),列的后10%的dataframe2(第12到23列),依此类推,直到最后10%的列(第109列)
这是我尝试开发的逻辑:
从总数的10%值中找到原始数据帧中的列为'n'
从原始数据框中选择第一个“ n”列。
将它们添加到新的数据框
从原始数据框中删除它们
检查原始数据帧中的列总数是否大于“ n”
如果否->重复步骤2至步骤5。
如果是->将所有剩余的列添加到最后创建的列
数据框。
我尝试了以下代码,但这是错误的。在下面的代码中,我尝试基于拆分百分比获取受尊重的列号,稍后我计划使用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)
谁能帮我这个逻辑是否正确以及如何实现?
最佳答案
如果将框架直接传递给该函数,则应该使您更容易确定以后要抓取的列。我们可以使用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等),值是从数据帧中选择的列。