开发者社区> 问答> 正文

映射Serie和Dataframe值

我有一个Dataframedf,其中的列是['col_A','col_B','col_C']并且有1000行。

我也有一个序列,该序列具有DataFrame的列名和一个介于0到1000之间的值作为索引。例如:s就是这样的Serie:

Col_A      20
Col_B      0
Col_C      300

我想将数据框更改为:

df.iloc[0:20,0] = a certain value  (column A)

我已经尝试过使用for循环进行切片,但是它花费了太多时间。有熊猫功能可以做到这一点吗?

我的代码是:

for i in range(0,3):
    df.iloc[0:s.iloc[i]-1,i] = -1

在一般情况下,有时我需要将Series索引映射到Dataframe列,但是很难找到一种快速且消耗较少的方法。

谢谢

问题来源:stackoverflow

展开
收起
is大龙 2020-03-23 16:45:30 445 0
1 条回答
写回答
取消 提交回答
  • 对于循环

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.randint(0,10, (1000,3)), 
                      columns=['col_A', 'col_B', 'col_C'])
    
    s = pd.Series([20,0,300], 
                  index=['col_A', 'col_B', 'col_C'])
    
    for col, idx in s.iteritems():
        df.loc[:idx, col] = -1
    
    df
         col_A  col_B  col_C
    0     -999   -999   -999
    1     -999      3   -999
    2     -999      3   -999
    3     -999      2   -999
    4     -999      1   -999
    ..     ...    ...    ...
    995      2      6      9
    996      1      9      5
    997      2      6      4
    998      4      0      1
    999      9      2      8
    

    熊猫适用

    def f(c, s):
        c[:s[c.name]] = -1
        return c
    
    df = df.apply(lambda c: f(c,s))
    df 
         col_A  col_B  col_C
    0       -1      6     -1
    1       -1      1     -1
    2       -1      6     -1
    3       -1      1     -1
    4       -1      6     -1
    ..     ...    ...    ...
    995      2      4      3
    996      2      0      0
    997      8      5      7
    998      3      5      5
    999      5      7      7
    

    性能在我的本地计算机上,使用N = 1000,for循环略快。将N增加到1M,apply方法更快:

    def for_loop(N):
        df = pd.DataFrame(np.random.randint(0,10, (N,3)), 
                      columns=['col_A', 'col_B', 'col_C'])
        for col, idx in s.iteritems():
            df.loc[:idx, col] = -1
        return df
    
    def apply_method(N):
    
        def f(c, s):
            c[:s[c.name]] = -1
            return c
    
        return df.apply(lambda c: f(c,s))
    
    %timeit for_loop(1000)
    1.19 ms ± 58.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    %timeit apply_method(1000)
    185 ms ± 44.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    %timeit for_loop(1000_000)
    303 ms ± 25.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    %timeit apply_method(1000_000)
    162 ms ± 8.84 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    回答来源:stackoverflow

    2020-03-23 16:45:35
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载