如何使用 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]
我根据 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]