问题描述
如何将序列与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
解决方法
尝试
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)
,
您可以尝试:
>>> s.apply(lambda x: tuple(x*np.array(t)))
为了避免列表理解和循环
,s = pd.Series(data=np.around(a=np.random.uniform(size=10),decimals=3))
t = (2,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,4.067)
8 (0.652,0.978,1.6300000000000001,2.282)
9 (0.446,0.669,1.115,1.561)
dtype: object
,
将元组转换为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,7))
s=pd.Series([tuple(x*t) for x in s]).
,
您可能想使用pandas DataFrame处理“二维”数据。您可以尝试以下操作:
import pandas as pd
import numpy as np
s = pd.Series(data=np.around(a=np.random.uniform(size=10),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