如果熊猫数据框df包含:
A B C D
a 1 2 3 4
b 2 NaN NaN 5
c NaN 7 NaN 2
d NaN 2 4 3
如何将第一行添加到所有其余行(仅在它们包含数字的地方)以获取结果数据框:
A B C D
b 3 NaN NaN 9
c NaN 9 NaN 6
d NaN 4 7 7
我打算这样做,然后制作一个行名称字典,并将第一个表的每一行的列乘积除以第二个表中的同一行,然后将值保存在字典中。我的工作代码可以做到这一点(如下),但是我担心它不够“ PANDAS”,并且对于我要执行的简单任务而言过于繁琐。我有最佳的解决方案,还是缺少明显的东西?
如果熊猫代码仍然需要遍历行,那是不值得的,但是我觉得应该有一种方法可以就地进行。
代码:
import numpy as np
import pandas as pd
dindex = [1,2,3] #indices of drugs to select (set this)
def get_drugs(): #generates random "drug characteristics" as pandas df
cduct = ['dose','g1','g2','g3','g4','g5']
drg = ['d1','d2','d3','d4']
return pd.DataFrame(abs(np.random.randn(6,4)),index=cduct,columns=drg)
def sel_drugs(dframe, selct): #removes unwanted drugs from df.
#Pass df and dindex to this function
return dframe.iloc[:,selct].values, dframe[1:].index.tolist()
#returns a tuple of [values, names]
def cal_conduct(val, cnames): #calculates conductance scaling.
#Pass values and names to this function
cduct = {} #initialize dict
for ix, gname in enumerate(cnames):
_top = val[ix+1]; _bot = val[0]+val[ix+1]
cduct[gname] = (np.product(_top[np.isfinite(_top)])/
np.product(_bot[np.isfinite(_bot)]))
return cduct #return a dictionary of scaling factors
def main():
selection = sel_drugs(get_drugs(),dindex)
print cal_conduct(selection[0], selection[1])
main()
熊猫会自动对齐/广播,因此很简单
In [8]: df
Out[8]:
A B C D
a 1 2 3 4
b 2 NaN NaN 5
c NaN 7 NaN 2
d NaN 2 4 3
In [11]: df.iloc[1:] + df.iloc[0]
Out[11]:
A B C D
b 3 NaN NaN 9
c NaN 9 NaN 6
d NaN 4 7 7
第二部分是这个,如果我没看错的话
In [12]: df2 = df.iloc[1:] + df.iloc[0]
In [13]: df.prod()
Out[13]:
A 2
B 28
C 12
D 120
dtype: float64
In [14]: df2/df.prod()
Out[14]:
A B C D
b 1.5 NaN NaN 0.075000
c NaN 0.321429 NaN 0.050000
d NaN 0.142857 0.583333 0.058333
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句