如何使用 Python 数据框生成可以添加为列的 list/sequence

How to use a Python data frame to generate a list/sequence that can be added as a column

我根据 sql 查询创建了一个数据框,该查询为直方图生成 bin 数据:最小值、最大值和 bin 大小。我想使用此数据创建一个 bin 列表,然后我可以将其合并回原始数据框

Here is a sample of my query output

我的查询为每个模型生成一行。然后我想创建一个列表,该列表从 initial_bin (0) 开始,然后递增 bin_size (7),直到达到最大值 (435)。结果列将被称为 bin_seq.

我下面的代码显示了我目前所处的位置。我可以使用 for 循环和 range() 函数生成包含所需序列的列表,但我不确定如何将其合并回数据框。

'''

import pyodbc
import pandas as pd
bin_sql = """
select 'test_model_1' model,  0 initial_bin , 435 maximum , 7 bin_size
    from analytics.model_data
        
"""

bin_data = pd.read_sql(bin_sql,conn)

bin_max = int(bin_data["maximum"]+bin_data["bin_size"])
bin_size = int(bin_data["bin_size"])
bin_start = int(bin_data["initial_bin"])

for i in range(bin_start, bin_max, bin_size):
    print(i, end=', ')

'''

Here is the image of the desired output

另一个问题是我的最终输出将有多个模型,每个模型都有自己的最大值和 bin 大小。所以我需要能够为每个模型生成自定义序列,然后将序列加入原始模型名称。

此代码将生成您想要的期望输出。你没有提到如何计算 bin_seq.

import pyodbc
import pandas as pd
bin_sql = """
select 'test_model_1' model,  0 initial_bin , 435 maximum , 7 bin_size
    from analytics.model_data
        
"""

bin_data = pd.read_sql(bin_sql,conn)

bin_max = int(bin_data["maximum"]+bin_data["bin_size"])
bin_size = int(bin_data["bin_size"])
bin_start = int(bin_data["initial_bin"])
bin_sq=[]
## For creating bin Sequence
temp=0
## Generating bin_seq
for i in range(bin_start, bin_max, bin_size):
    bin_sq.append(temp)
    temp=temp+bin_size
## Adding bin_seq in dataframe
bin_data['bin_seq']=bin_sq

尝试:

设置一个MRE:

df = pd.DataFrame([['test_model', 0, 435, 7]],
                  columns=['model', 'initial_bin', 'maximum', 'bin_size'])
print(df)

# Output
        model  initial_bin  maximum  bin_size
0  test_model            0      435         7
bin_seq = lambda x: range(x['initial_bin'], x['maximum'], x['bin_size'])
df = df.assign(bin_seq=df.apply(bin_seq, axis=1)) \
       .explode('bin_seq').reset_index(drop=True)
print(df)

# Output
         model  initial_bin  maximum  bin_size bin_seq
0   test_model            0      435         7       0
1   test_model            0      435         7       7
2   test_model            0      435         7      14
3   test_model            0      435         7      21
4   test_model            0      435         7      28
..         ...          ...      ...       ...     ...
58  test_model            0      435         7     406
59  test_model            0      435         7     413
60  test_model            0      435         7     420
61  test_model            0      435         7     427
62  test_model            0      435         7     434

[63 rows x 5 columns]