【问题标题】:Is it possible to optimize update of a pandas dataframe that involves only some rows?是否可以优化只涉及某些行的 pandas 数据框的更新?
【发布时间】:2014-11-10 10:44:34
【问题描述】:

我有一个熊猫数据框。其中一列(我们称之为col1)包含标称值(例如ABC 等)。我还有一本将这些标称值映射为数值的字典(例如:my_dict = {'A':3, 'B':1, 'C':1})。现在我通过以下方式创建一个新列:

df['col2'] = map(my_dict, df['col1'])

现在假设我更改了字典中的一个值。例如C 键现在映射到7 而不是1。我也想分别更新col2。其中一种方法是重新计算所有行。但是,也许有一种方法可以只更改那些需要更改的行。有没有办法做到这一点?

【问题讨论】:

    标签: python optimization map pandas


    【解决方案1】:

    您可以使用loc 并仅更改值1 与映射C 与新映射的字典键C

    import pandas as pd
    
    df = pd.DataFrame(['A','B','A','C','A','B','C','A','C'],columns=['col1'])
    my_dict = {'A':3, 'B':1, 'C':1}
    
    # by the way you need lambda with map
    %timeit df['col2'] = map(lambda x: my_dict[x], df['col1'])
    1000 loops, best of 3: 205 µs per loop
    

    现在将Cmy_dict键的值改为7

    my_dict = {'A':3, 'B':1, 'C':7}
    
    %timeit df['col2'] = map(lambda x: my_dict[x], df['col1'])
    1000 loops, best of 3: 210 µs per loop
    
    %timeit df.loc[df['col1']=='C']['col2'] = my_dict['C']
    10 loops, best of 3: 43.7 ms per loop
    

    两者的结果相同

    df
      col1  col2
    0    A     3
    1    B     1
    2    A     3
    3    C     7
    4    A     3
    5    B     1
    6    C     7
    7    A     3
    8    C     7
    

    显然在这种情况下使用loc 更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多