【问题标题】:How to use a Python data frame to generate a list/sequence that can be added as a column如何使用 Python 数据框生成可以添加为列的列表/序列
【发布时间】:2022-01-26 01:39:21
【问题描述】:

我从 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_data 示例更新您的帖子,例如bin_data.head()
  • @Corralien -- 刚刚更新

标签: python pandas list for-loop sequence


【解决方案1】:

试试:

设置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]

【讨论】:

    【解决方案2】:

    此代码将生成您想要的期望输出。你没有提到如何计算 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多