Python 熊猫将特定列乘以行中的值
我试图在多个特定列各自的行中添加一个值 例如:Python 熊猫将特定列乘以行中的值,python,pandas,multiplication,Python,Pandas,Multiplication,我试图在多个特定列各自的行中添加一个值 例如: X Y Z A 10 1 0 1 B 50 0 0 0 C 80 1 1 1 将成为: X Y Z A 10 10 0 10
X Y Z
A 10 1 0 1
B 50 0 0 0
C 80 1 1 1
将成为:
X Y Z
A 10 10 0 10
B 50 0 0 0
C 80 80 80 80
我遇到的问题是,当我使用mul时,它超时了。我的真实数据集非常大。我尝试在实际代码中使用循环对其进行迭代,如下所示:
for i in range(1,df_final_small.shape[0]):
df_final_small.iloc[i].values[3:248] = df_final_small.iloc[i].values[3:248] * df_final_small.iloc[i].values[2]
当应用于示例数据帧时,其如下所示:
for i in range(1,df_final_small.shape[0]):
df_final_small.iloc[i].values[1:4] = df_final_small.iloc[i].values[1:4] * df_final_small.iloc[i].values[0]
一定有更好的方法可以做到这一点,我在弄清楚如何只将乘法转换为行中的某些列而不是整行时遇到了问题
编辑:
这里更详细的是我的df.head5
id gross 150413 Welcome Email 150413 Welcome Email Repeat Cust 151001 Welcome Email 151001 Welcome Email Repeat Cust 161116 eKomi 1702 Hot Leads Email 1702 Welcome Email - All Purchases 1804 Hot Leads ... SILVER GOLD PLATINUM Acquisition Direct Mail Conversion Direct Mail Retention Direct Mail Retention eMail cluster x y
0 0033333 46.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 10 -0.230876 0.461990
1 0033331 2359.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 9 0.231935 -0.648713
2 0033332 117.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 5 -0.812921 -0.139403
3 0033334 89.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 5 -0.812921 -0.139403
4 0033335 1908.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 1.0 0.0 0.0 7 -0.974142 0.145032
使用axis=0的mul还可以通过get_level_值获取索引值
此外,当数据帧变得很大时,您可以将其拆分并按块执行
dfs = np.split(df, [2], axis=0)
pd.concat([x.mul(x.index.get_level_values(1), axis=0) for x in dfs])
Out[174]:
X Y Z
A 10 10 0 10
B 50 0 0 0
C 80 80 80 80
我也会推荐numpy广播
df.values*df.index.get_level_values(1)[:,None]
Out[177]: Int64Index([[10, 0, 10], [0, 0, 0], [80, 80, 80]], dtype='int64')
pd.DataFrame(df.values*df.index.get_level_values(1)[:,None],index=df.index,columns=df.columns)
Out[181]:
X Y Z
A 10 10 0 10
B 50 0 0 0
C 80 80 80 80
只需指定要相乘的列。范例
df=pd.DataFrame({'A':10,'X':1,'Y':1,'Z':1},index=[1])
df.loc[:,['X', 'Y', 'Z']]=df.loc[:,['X', 'Y', 'Z']].values*df.iloc[:,0:1].values
如果要提供任意范围的列,请使用iloc
range_of_columns= range(10,5001)+range(5030,10001)
df.iloc[:,range_of_columns].values*df.iloc[:,0:1].values #multiplying the range of columns with the first column
索引是50,你需要从中提取数字吗?你能打印df.head5吗?我的完整数据集和测试用例都有一个索引错误:indexer:太多级别:索引只有1个级别,而不是3个级别。我想这是另一列。只看OP的solutionRangeIndexstart=0,stop=17692,step=1为了澄清,请查看我的原始数据集,我只想用gross乘以包含0或1的字段,还有其他列我不想乘以。现在尝试你的第三个解决方案。@ JoePrpNARDUN它有点不清楚,也许考虑修复你的样本DATAFRAM,这是我以前做过的,但是我不想在未来确定10000个列,例如10-5000和5030万个部分需要通过乘法归一化。使用你的解决方案:DF= PD.DATAFRAMEY{'A':10,'X':1,'Y':1,'Z':1},索引=[1]df.loc[:,['X','Y','Z']]。值df.iloc[:,0:1]。值df=df.loc[:,['X','Y','Z']]。值df.iloc[:,0:1].values print df结果是一个numpy数组,我想编辑整个dataframe.mad u更新更接近,但没有为我的数据集运行,第二个解决方案中添加了总列第2列以及我想乘以的列范围,如我的问题尝试中所述。这里是我基于第二个so使用的代码解析:列的范围=范围3248 df\u final\u small.iloc[:,列的范围].值*df\u final\u small.iloc[:,0:2].值输出如下:ValueError:操作数无法与形状5245 5,2一起广播要澄清,我想将“gross”列2乘以第3列到248列。mad u我不确定你在说什么,你能澄清你想让我做什么编辑吗?我的df.head5中发布的索引列不是colu中的一个mns。第0列是id,第1列是gross。我的问题仍然存在,之前的推荐是一个打字错误,我的道歉应该是:为了澄清,我想将第3列到第248列乘以第1列的“gross”。
range_of_columns= range(10,5001)+range(5030,10001)
df.iloc[:,range_of_columns].values*df.iloc[:,0:1].values #multiplying the range of columns with the first column