【问题标题】:Set values in dataframe A by iterating from values on dataframe B通过从数据框 B 上的值迭代来设置数据框 A 中的值
【发布时间】:2023-02-08 17:32:52
【问题描述】:

数据框 A 与此类似:

info2 = {'speed': [None]*80}
dfA = pd.DataFrame(info2)
dfA

数据框 B 与此类似:

info={"IndexSpeed":[7,16,44,56,80],"speed":[25,50,25,50,90]}
dfB = pd.DataFrame(info)
dfB

我需要使用 dfB 中的值来设置 dfA['speed'] 中的值。 例如,对于索引 <= 7 的 dfA 中的每一行,速度应设置为 25。 对于 8 到 16 之间的每一行索引,速度应设置为 50。依此类推,直到设置完所有 80 行。

这样做的最佳方法是什么?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用merge_asof:

    dfA['speed'] = pd.merge_asof(dfA.drop(columns='speed'), dfB,
                                 left_index=True, right_on='IndexSpeed',
                                 direction='forward',
                                 )['speed']
    

    注意。 dfA 必须按其索引排序,而 dfB 必须按 IndexSpeed 排序。

    输出:

        speed
    0      25
    1      25
    2      25
    3      25
    4      25
    ..    ...
    75     90
    76     90
    77     90
    78     90
    79     90
    
    [80 rows x 1 columns]
    

    输出为数组:

    array([25, 25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 50, 50, 50, 50, 50, 50,
           25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
           25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 50, 50, 50, 50, 50, 50,
           50, 50, 50, 50, 50, 50, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
           90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90])
    

    【讨论】:

    • 谢谢,就像一个魅力
    【解决方案2】:

    也许使用带有对应于具有两个组件的元组的键的字典

    index_mapper = {(0,7): 0, (8,16): 1}
    
    for lower, upper in index_mapper:
        dfA.iloc[lower:upper,0] = dfB.iloc[index_mapper[(lower, upper)],1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2023-01-14
      • 1970-01-01
      • 2017-04-15
      相关资源
      最近更新 更多