Python Pandas:循环转置DataFrame指定列相乘遇空值问题求助
解决Pandas中DataFrame列相乘的空值问题
先重现你的场景代码,方便大家理解问题:
import pandas as pd ddd = pd.DataFrame({'a' : [1,1,1],'b' : [1,1,1],'c' : [1,1,1],'d' : [1,1,1],'e' : [1,1,1] }) fff = pd.DataFrame({'a' : [3,3,3]})
你期望将ddd的b、c、d列与fff的a列相乘,得到指定的输出结果,但之前的循环代码返回了全空值,下面来分析原因并给出解决方案。
为什么你的循环代码会得到空值?
你之前的代码:
for i in range(3): print(fff.a.T.multiply(ddd.iloc[i,1:4]))
核心问题是索引不匹配:
fff.a.T转置后是一个Series,它的索引是[0,1,2](对应原fff的行索引)ddd.iloc[i,1:4]取的是ddd第i行的b、c、d列,这个Series的索引是['b','c','d']
当两个索引完全不匹配的Series相乘时,Pandas无法找到对应匹配的值,因此结果全为NaN。
正确的解决方案(优先推荐无循环的向量化操作)
Pandas的向量化操作效率远高于循环,完全不需要写循环就能实现需求:
# 直接对ddd的b、c、d列,与fff的a列按行相乘并赋值 ddd[['b', 'c', 'd']] = ddd[['b', 'c', 'd']].multiply(fff['a'], axis=0) print(ddd)
运行后就能得到你想要的结果:
a b c d e 0 1 3 3 3 1 1 1 3 3 3 1 2 1 3 3 3 1
如果一定要用循环实现(不推荐,仅作演示)
如果坚持要使用循环,需要确保相乘的两个对象索引匹配,比如直接取fff的标量值进行计算:
for i in range(3): # 取出fff对应行的a值作为标量,与ddd对应行的b、c、d列相乘 ddd.loc[i, ['b', 'c', 'd']] = ddd.loc[i, ['b', 'c', 'd']] * fff['a'].iloc[i] print(ddd)
这个方法也能得到正确结果,但对于大数据集来说,循环的执行效率会比向量化操作低很多,所以优先推荐前面的无循环方案。
内容的提问来源于stack exchange,提问作者Ajay Chinni
相关产品推荐
相关产品推荐

