【问题标题】:Python how to generate additional values between two row-values in a dataframePython如何在数据框中的两个行值之间生成附加值
【发布时间】:2019-07-31 21:25:38
【问题描述】:

我有一个包含两个浮点列的数据框。我想在行值之间创建额外的浮点值。顺便说一句,我想将生成的值堆叠到它们之间的新行中。我有两种方法可以做到。

df = 
       data1    data2   
0      1.913  8.284000
1     13.060  8.261000
2     24.041  8.252000

我想在上述数据框中的行之间生成 5 个额外的行。我想通过两种方法实现它。

方法1:预期输出如下。在此,附加值在 data1 列中创建为np.linspace(1.913,13.060,7),如下所示,从索引 0 到 6。data2 列在这些附加行中保持恒定值 8.284。

newdf1 = 
       data1           data2   
0      1.913          8.284000   ## Original row
1      3.77083333     8.284000   ## Generated row  
2      5.62866667     8.284000   ## Generated row  
3      7.4865         8.284000   ## Generated row   
4      9.34433333     8.284000   ## Generated row  
5      11.20216667    8.284000   ## Generated row             
6      13.060         8.261000   ## Original 
7                     8.261000
.                     8.261000
.
                      8.261000
12     24.041        8.252000 

方法2:预期输出如下。 data1 列采用与上述方法 1 相同的方法。现在,data2 列的值也被映射了。例如,np.linspace(8.284000,8.261000,7)

newdf2 = 
       data1           data2   
0      1.913          8.284000     ## Original row
1      3.77083333     8.28016667   ## Generated row  
2      5.62866667     8.27633333   ## Generated row  
3      7.4865         8.2725       ## Generated row   
4      9.34433333     8.26866667   ## Generated row  
5      11.20216667    8.26483333   ## Generated row             
6      13.060         8.261000     ## Original 
7      
.

12     24.041        8.252000

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我建议将你的任务分成两部分:

    1. 在 DataFrame 中插入(空)额外行
    2. 根据您给定的规则(插值)填充这些额外的行。

    对于第一部分,一个(诚然复杂的)列表理解就可以了。对于第二部分,熊猫DataFrame的方法.interpolate()是你的朋友。

    但我们不要超越自己。我们首先生成你原来的DataFrame

    df = pd.DataFrame({'data1': [1.913, 13.060, 24.041], 'data2': [8.284, 8.261, 8.252]})
    

    1。在现有值之间插入额外的行

    现在我们生成一个包含原始数据的dict,以及介于两者之间的额外值 (NaNs)。然后我们从dict 创建一个新的DataFrame

    line_ins = 5 # Number of lines to insert
    res_dict = {col: [y for val in df[col] for y in [val] + [np.nan]*line_ins][:-line_ins] for col in df.columns}
    df_new = pd.DataFrame(res_dict)
    

    列表推导说明:对于DataFrame's 列中的每个值(val),我们还添加五个np.nan's([val] + [np.nan]*line_ins)。 最后,我们从生成的列表 ([:-line_ins]) 中删除了最后五个值,因为我们不希望在最后一个值之后有额外的行。最后,我们将列表展平(因此是堆叠列表理解)。

    2。确定新行的值(插值)

    方法一

    在这种情况下,我们希望对列 data1 进行线性插值,而对于 data2,我们希望使用现有值:

    df_new['data1'] = df_new['data1'].interpolate()
    df_new['data2'] = df_new['data2'].interpolate(method='pad')
    

    生成的df_new 包含以下内容:

            data1  data2
    0    1.913000  8.284
    1    3.770833  8.284
    2    5.628667  8.284
    3    7.486500  8.284
    4    9.344333  8.284
    5   11.202167  8.284
    6   13.060000  8.261
    7   14.890167  8.261
    8   16.720333  8.261
    9   18.550500  8.261
    10  20.380667  8.261
    11  22.210833  8.261
    12  24.041000  8.252
    

    方法二

    在这种情况下,我们希望对两列进行线性插值,让事情变得更简单:

    df_new = df_new.interpolate()
    

    以及生成的df_new的内容:

            data1     data2
    0    1.913000  8.284000
    1    3.770833  8.280167
    2    5.628667  8.276333
    3    7.486500  8.272500
    4    9.344333  8.268667
    5   11.202167  8.264833
    6   13.060000  8.261000
    7   14.890167  8.259500
    8   16.720333  8.258000
    9   18.550500  8.256500
    10  20.380667  8.255000
    11  22.210833  8.253500
    12  24.041000  8.252000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2019-12-16
      • 2014-12-05
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      相关资源
      最近更新 更多