我需要创建一个DataFrame,其中包含n个原始数组的所有可能的唯一组合,这些组合有几个约束条件.我希望能够做到这一点,而不会因为内存限制而过滤掉初始数据帧.

将有两种类型的原始输入array.它们的布尔值将仅为True和False,或者它们将具有可变数量的浮点值.

另外一个棘手的问题是,任何行都应该只有一个非零浮点值,其他浮点值必须是0.

示例输入:

inputs = {
    "a": [True, False],
    "b": [True, False],
    "c": [0.0, 0.1, 0.2],
    "d": [0.0, 0.1, 0.2, 0.3],
}

bool_inputs = {"a", "b"}
float_inputs = {"c", "d"}

输出示例:

        a      b    c    d
0    True   True  0.0  0.0
1    True  False  0.0  0.0
2   False   True  0.0  0.0
3   False  False  0.0  0.0
4    True   True  0.1  0.0
5    True  False  0.1  0.0
6   False   True  0.1  0.0
7   False  False  0.1  0.0
8    True   True  0.2  0.0
9    True  False  0.2  0.0
10  False   True  0.2  0.0
11  False  False  0.2  0.0
12   True   True  0.0  0.1
13   True  False  0.0  0.1
14  False   True  0.0  0.1
15  False  False  0.0  0.1
16   True   True  0.0  0.2
17   True  False  0.0  0.2
18  False   True  0.0  0.2
19  False  False  0.0  0.2
20   True   True  0.0  0.3
21   True  False  0.0  0.3
22  False   True  0.0  0.3
23  False  False  0.0  0.3

我已经能够做到这一点,过滤数据事后与以下解决方案,但我不想有任何过滤.另外一个好处是不必修复列类型

import numpy as np
import pandas as pd


input_arrays = list(inputs.values())
results = np.array(np.meshgrid(*input_arrays)).T.reshape(-1, len(inputs))

df = pd.DataFrame(results, columns=list(inputs.keys()))

df[list(bool_inputs)] = df[list(bool_inputs)].astype(bool)
df = df[~(df[list(float_inputs)] > 0).all(axis=1)]
df = df.reset_index(drop=True)

推荐答案

不需要过滤浮动列的关键是生成块对角矩阵.这里的其他东西都只有.join(..., how = 'cross')美元

from scipy.linalg import block_diag
import pandas as pd
import numpy as np

inputs = {
    "a": [True, False],
    "b": [True, False],
    "c": [0.0, 0.1, 0.2],
    "d": [0.0, 0.1, 0.2, 0.3],
}

bool_inputs = {"a", "b"}
float_inputs = {"c", "d"}

num = block_diag(*[np.atleast_2d(inputs[k][1:]) for k in float_inputs]).T
df = pd.DataFrame(columns = float_inputs, data = num)


for k in bool_inputs:
    df = df.join(pd.DataFrame(columns = [k], data = inputs[k]), how = 'cross')
    
df = df.reindex(sorted(df.columns), axis=1)

输出:

        a      b    c    d
0    True   True  0.1  0.0
1   False   True  0.1  0.0
2    True  False  0.1  0.0
3   False  False  0.1  0.0
4    True   True  0.2  0.0
5   False   True  0.2  0.0
6    True  False  0.2  0.0
7   False  False  0.2  0.0
8    True   True  0.0  0.1
9   False   True  0.0  0.1
10   True  False  0.0  0.1
11  False  False  0.0  0.1
12   True   True  0.0  0.2
13  False   True  0.0  0.2
14   True  False  0.0  0.2
15  False  False  0.0  0.2
16   True   True  0.0  0.3
17  False   True  0.0  0.3
18   True  False  0.0  0.3
19  False  False  0.0  0.3

编辑:我假设只有一个非零浮点列是严格的,否则替换:

num = block_diag(*[np.atleast_2d(inputs[k][1:]) for k in float_inputs]).T
df = pd.DataFrame(columns = float_inputs, data = num)

有:

num = block_diag(*[np.atleast_2d(inputs[k][1:]) for k in float_inputs]).T
num = np.r_[np.zeros_like(num)[[0], :], num]
df = pd.DataFrame(columns = float_inputs, data = num)

Python相关问答推荐

连接两个具有不同标题的收件箱

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

如何避免Chained when/then分配中的Mypy不兼容类型警告?

使用@ guardlasses. guardlass和注释的Python继承

如何并行化/加速并行numba代码?

如何在Python中获取`Genericums`超级类型?

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

为什么if2/if3会提供两种不同的输出?

Python—为什么我的代码返回一个TypeError

Tensorflow tokenizer问题.num_words到底做了什么?

如何重新组织我的Pandas DataFrame,使列名成为列值?

合并相似列表

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

随机森林n_估计器的计算

极点:在固定点扩展窗口

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?

使用美汤对维基百科表格进行网络刮擦未返回任何内容

#将多条一维曲线计算成其二维数组(图像)表示

如何计算Pandas 中具有特定条件的行之间的天差

根据两个lambda条件筛选组并根据条件创建新列的最佳方式是什么?