为了账号安全,请及时绑定邮箱和手机立即绑定

根据其他列中给出的值在熊猫数据框中生成 n 数量的新行

根据其他列中给出的值在熊猫数据框中生成 n 数量的新行

冉冉说 2023-04-18 14:29:05
因此,我有以下示例数据框(为了清晰/简单起见,仅包含一行):df = pd.DataFrame({'base_number': [2],                   'std_dev': [1]})df['amount_needed'] = 5df['upper_bound'] = df['base_number'] + df['std_dev']df['lower_bound'] = df['base_number'] - df['std_dev']对于每个给定的行,我想生成行数,使得每行的总数是给定的数字df['amount_needed'](在本例中为 5)。我希望这 5 行新行分布在df['upper_bound']和给出的范围内df['lower_bound']。因此,对于上面的示例,我希望输出以下结果:df_new = pd.DataFrame({'base_number': [1, 1.5, 2, 2.5, 3]})当然,这个过程将针对一个更大的数据框中的所有行完成,许多其他列与这个特定问题无关,这就是为什么我试图找到一种方法来自动化这个过程。
查看完整描述

2 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

最终使用 jsmart 的贡献并对其进行处理以生成一个新的数据框,保留原始 id,以便根据需要根据 id 将旧列中的其他列合并到这个新列中(整个过程如下所示):


amount_needed = 5

df = pd.DataFrame({'base_number': [2, 4, 8, 0],


                   'std_dev': [1, 2, 3, 0]})

df['amount_needed'] = amount_needed

df['upper_bound'] = df['base_number'] + df['std_dev']

df['lower_bound'] = df['base_number'] - df['std_dev']


s1 = pd.Series([],dtype = int)

for row in df.itertuples():

    arr = np.linspace(row.lower_bound, 

                      row.upper_bound, 

                      row.amount_needed)

    s = pd.Series(arr).rename('base_number')

    s1 = pd.concat([s1, s])

  

df_new = pd.DataFrame({'base_number': s1})


ids_og = list(range(1, len(df) + 1))

ids_og = [ids_og] * amount_needed

ids_og = sorted(list(itertools.chain.from_iterable(ids_og)))


df_new['id'] = ids_og


查看完整回答
反对 回复 2023-04-18
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

一排df将创建一个系列(或一个数据框)。这是一种迭代df并使用您指定的值创建系列的方法:


for row in df.itertuples():

    arr = np.linspace(row.lower_bound, 

                      row.upper_bound, 

                      row.amount_needed)

    s = pd.Series(arr).rename('base_number')

    

print(s)


0    1.0

1    1.5

2    2.0

3    2.5

4    3.0

Name: base_number, dtype: float64


查看完整回答
反对 回复 2023-04-18
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信