【问题标题】:Multiply series by tuple将系列乘以元组
【发布时间】:2020-10-04 15:03:25
【问题描述】:

如何将系列与tuple 相乘,系列中的每个值将乘以tuple 中的每个值。

我编写了一个代码示例来向您展示预期结果的示例:

import numpy as np
import pandas as pd

def main():
    s = pd.Series(data=np.around(a=np.random.uniform(size=10), decimals=3))
    t = (2, 3, 5, 7)
    print(s)

if __name__ == '__main__':
    main()

我的输出:

0    0.709
1    0.567
2    0.894
3    0.660
4    0.348
5    0.465
6    0.974
7    0.832
8    0.888
9    0.265
dtype: float64

我需要得到这个结果:

0    (1.418, 2.127, 3.545, 4.963)
1    (1.134, 1.701, 2.835, 3.969)
2    (..., ..., ..., ...)
3    (..., ..., ..., ...)
4    (..., ..., ..., ...)
5    (..., ..., ..., ...)
6    (..., ..., ..., ...)
7    (..., ..., ..., ...)
8    (..., ..., ..., ...)
9    (..., ..., ..., ...)
dtype: float64

【问题讨论】:

    标签: python pandas series


    【解决方案1】:

    试试

    import numpy as np
    import pandas as pd
    
    def main():
        s = pd.DataFrame(data=np.around(a=np.random.uniform(size=10), decimals=3))
        t = (2, 3, 5, 7)
        s[0] = s[0].apply(lambda x: tuple([(x *  y) for y in t]))
        print(s)
    
    if __name__ == '__main__':
        main()
    

    输出

    0           (1.168, 1.7519999999999998, 2.92, 4.088)
    1           (1.332, 1.9980000000000002, 3.33, 4.662)
    2                       (1.254, 1.881, 3.135, 4.389)
    3  (1.372, 2.0580000000000003, 3.43, 4.8020000000...
    4          (0.846, 1.269, 2.1149999999999998, 2.961)
    5          (0.386, 0.579, 0.9650000000000001, 1.351)
    6          (1.528, 2.292, 3.8200000000000003, 5.348)
    7                            (0.64, 0.96, 1.6, 2.24)
    8                        (1.75, 2.625, 4.375, 6.125)
    9                       (1.234, 1.851, 3.085, 4.319)
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      >>> s.apply(lambda x: tuple(x*np.array(t)))
      

      为了避免列表理解和循环

      【讨论】:

        【解决方案3】:
        s = pd.Series(data=np.around(a=np.random.uniform(size=10), decimals=3))
        t = (2, 3, 5, 7)
        s = pd.Series([i for i in zip(*[s*i for i in t])])
        s
        

        输出:

        0    (1.162, 1.7429999999999999, 2.905, 4.067)
        1    (1.746, 2.6189999999999998, 4.365, 6.111)
        2                  (0.516, 0.774, 1.29, 1.806)
        3                      (1.68, 2.52, 4.2, 5.88)
        4                  (1.048, 1.572, 2.62, 3.668)
        5                  (0.412, 0.618, 1.03, 1.442)
        6                 (1.426, 2.139, 3.565, 4.991)
        7    (1.162, 1.7429999999999999, 2.905, 4.067)
        8    (0.652, 0.978, 1.6300000000000001, 2.282)
        9                 (0.446, 0.669, 1.115, 1.561)
        dtype: object
        

        【讨论】:

          【解决方案4】:

          将元组转换为 NumPy 数组可以让您的工作更轻松。它只是将整个数组与 Series 中存在的元素相乘,然后您可以再次将 NumPy 数组转换为元组。尽管使用 numpy 数组处理更大尺寸的元组时多次转换效率不高。如果在处理 NumPy 数组的系列中不需要出现元组是一个很好的做法。下面的代码完成了这项工作。

              import pandas as pd
              import numpy as np
              s = pd.Series(data=np.around(a=np.random.uniform(size=10), decimals=3))
              t = np.array((2, 3, 5, 7))
              s=pd.Series([tuple(x*t) for x in s]).
          

          【讨论】:

            【解决方案5】:

            您可能希望使用 pandas DataFrame 来处理“二维”数据。您可以尝试以下方法:

            import pandas as pd
            import numpy as np
            
            
            s = pd.Series(data=np.around(a=np.random.uniform(size=10), decimals=3))
            t = (2, 3, 5, 7)
            
            df = pd.DataFrame()
            
            for i, value in enumerate(t):
                col = i
                df[col] = s * value
            
            print(df)
            

            此代码打印:

                   0      1      2      3
            0  1.640  2.460  4.100  5.740
            1  1.544  2.316  3.860  5.404
            2  1.556  2.334  3.890  5.446
            3  0.710  1.065  1.775  2.485
            4  1.816  2.724  4.540  6.356
            5  0.778  1.167  1.945  2.723
            6  0.628  0.942  1.570  2.198
            7  0.800  1.200  2.000  2.800
            8  0.538  0.807  1.345  1.883
            9  1.520  2.280  3.800  5.320
            

            【讨论】:

              猜你喜欢
              • 2016-05-25
              • 2010-12-19
              • 1970-01-01
              • 2022-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-07-20
              相关资源
              最近更新 更多