Умножение рядов на кортеж

#python #pandas #series

#python #панды #Серии

Вопрос:

Как мне умножить ряд на 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
  

Ответ №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 упрощает вашу работу. Он просто умножает весь массив на элемент, присутствующий в ряду, а затем u может снова преобразовать массив 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 для работы с «2-мерными» данными. Вы можете попробовать следующее:

 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