如何将两个创建的系列相乘以创建第三个系列

时间:2018-08-27 06:18:20

标签: python python-3.x dataframe lambda

我创建了两个系列,我想通过对前两个进行逐元素乘法来创建第三个系列。我的代码如下:

new_samples = 10 # Number of samples in series
a = pd.Series([list(map(lambda x:x,np.linspace(2,2,new_samples)))],index=['Current'])
b = pd.Series([list(map(lambda x:x,np.linspace(10,0,new_samples)))],index=['Voltage'])
c = pd.Series([x*y for x,y in zip(a.tolist(),b.tolist())],index=['Power'])

我的输出是:

TypeError: can't multiply sequence by non-int of type 'list'

为使内容更清楚,我在下面粘贴了实际的for循环代码。我的数据框已经有三列CurrentVoltagePower。根据我的要求,我必须将新值列表添加到现有列VoltageCurrent中。但是,Power值是通过将已经创建的值相乘来创建的。我的代码如下:

for i,j in zip(IV_start_index,IV_start_index[1:]):            
    isc_act = module_allData_df['Current'].iloc[i:j-1].max()
    isc_indx = module_allData_df['Current'].iloc[i:j-1].idxmax()
    sample_count = int((j-i)/(module_allData_df['Voltage'].iloc[i]-module_allData_df['Voltage'].iloc[j-1]))
    new_samples = int(sample_count * (module_allData_df['Voltage'].iloc[isc_indx]))
    missing_current = pd.Series([list(map(lambda x:x,np.linspace(isc_act,isc_act,new_samples)))],index=['Current'])
    missing_voltage = pd.Series([list(map(lambda x:x,np.linspace(module_allData_df['Voltage'].iloc[isc_indx],0,new_samples)))],index=['Voltage'])
    print(missing_current.tolist()*missing_voltage.tolist())

样本数据:module_allData_df.head()

     Voltage  Current    Power  
0  33.009998   -0.004 -0.13204  
1  33.009998    0.005  0.16505  
2  32.970001    0.046  1.51662  
3  32.950001    0.087  2.86665  
4  32.919998    0.128  4.21376 

样本数据:module_allData_df.iloc [120:126],您也需要这样做

       Voltage  Current    Power  
120   0.980000    5.449  5.34002  
121   0.920000    5.449  5.01308  
122   0.860000    5.449  4.68614  
123   0.790000    5.449  4.30471  
124  33.110001   -0.004 -0.13244  
125  33.110001    0.005  0.16555  

样本数据:IV_start_index [:5]

[0, 124, 251, 381, 512]

基于@jezrael的答案,我成功创建了三个单独的系列。如何将它们附加到主数据框。下图说明了我的要求。 enter image description here

3 个答案:

答案 0 :(得分:1)

问题是每个系列是一个带有列表的元素,因此不可能使用向量化操作。

a = pd.Series([list(map(lambda x:x,np.linspace(2,2,new_samples)))],index=['Current'])
b = pd.Series([list(map(lambda x:x,np.linspace(10,0,new_samples)))],index=['Voltage'])

print (a)
Current    [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, ...
dtype: object

print (b)
Voltage    [10.0, 8.88888888888889, 7.777777777777778, 6....
dtype: object

因此,我认为需要删除[],并在必要时添加参数name

a = pd.Series(list(map(lambda x:x,np.linspace(2,2,new_samples))), name='Current')
b = pd.Series(list(map(lambda x:x,np.linspace(10,0,new_samples))),name='Voltage')
print (a)
0    2.0
1    2.0
2    2.0
3    2.0
4    2.0
5    2.0
6    2.0
7    2.0
8    2.0
9    2.0
Name: Current, dtype: float64

print (b)
0    10.000000
1     8.888889
2     7.777778
3     6.666667
4     5.555556
5     4.444444
6     3.333333
7     2.222222
8     1.111111
9     0.000000
Name: Voltage, dtype: float64

c = a * b
print (c)
0    20.000000
1    17.777778
2    15.555556
3    13.333333
4    11.111111
5     8.888889
6     6.666667
7     4.444444
8     2.222222
9     0.000000
dtype: float64

编辑:

如果要输出乘以Series,则需要最后2行:

missing_current = pd.Series(list(map(lambda x:x,np.linspace(isc_act,isc_act,new_samples))))
missing_voltage = pd.Series(list(map(lambda x:x,np.linspace(module_allData_df['Voltage'].iloc[isc_indx],0,new_samples))))
print(missing_current *missing_voltage)

答案 1 :(得分:1)

使用numpy更容易。

import numpy as np
new_samples = 10 # Number of samples in series
a = np.array(np.linspace(2,2,new_samples))
b = np.array(np.linspace(10,0,new_samples))
c = a*b
print(c)

输出:

  

array([20。,17.77777778,15.55555556,13.33333333,   11.11111111,           8.88888889、6.66666667、4.44444444、2.22222222、0。])

在使用pandas数据框进行所有操作时,请使用以下代码。

import pandas as pd
new_samples = 10 # Number of samples in series
df = pd.DataFrame({'Current':np.linspace(2,2,new_samples),'Voltage':np.linspace(10,0,new_samples)})
df['Power'] = df['Current'] * df['Voltage']
print(df.to_string(index=False))

输出:

Current    Voltage      Power
    2.0  10.000000  20.000000
    2.0   8.888889  17.777778
    2.0   7.777778  15.555556
    2.0   6.666667  13.333333
    2.0   5.555556  11.111111
    2.0   4.444444   8.888889
    2.0   3.333333   6.666667
    2.0   2.222222   4.444444
    2.0   1.111111   2.222222
    2.0   0.000000   0.000000

答案 2 :(得分:0)

由于它们是级数,您应该可以将它们乘以c = a * b

您可以在数据框中添加a和b,而c则成为第三列