[英]Python/Pandas - create row value if another row value < the column name
我有一个可以用这个创建的数据框:
import pandas as pd
import numpy as np
#create df
data={'id':['a','b','c','d'],
'cd':[0,4,1,3],
'ddf':[2,5,2,5],
0:np.nan,
1:np.nan,
2:np.nan,
3:np.nan,
4:np.nan,
5:np.nan,
6:np.nan
}
df=pd.DataFrame.from_dict(data)[['id','cd','ddf',0,1,2,3,4,5,6]]
看起来像这样:
df
Out[35]:
id cd ddf 0 1 2 3 4 5 6
0 a 0 2 NaN NaN NaN NaN NaN NaN NaN
1 b 4 5 NaN NaN NaN NaN NaN NaN NaN
2 c 1 2 NaN NaN NaN NaN NaN NaN NaN
3 d 3 5 NaN NaN NaN NaN NaN NaN NaN
我想要做的是计算列0,1,2,3,4,5,6和df ['cd']的列名之间的差异 - >如果列名是> =到df['cd']
和列名是<=到df['ddf']
。 生成的df
应如下所示:
df
Out[45]:
id cd ddf 0 1 2 3 4 5 6
0 a 0 2 0.0 1.0 2.0 NaN NaN NaN NaN
1 b 4 5 NaN NaN NaN NaN 0.0 1.0 NaN
2 c 1 2 NaN 0.0 1.0 NaN NaN NaN NaN
3 d 3 5 NaN NaN NaN 0.0 1.0 2.0 NaN
我使用以下方法成功填写了IF子句的第一部分:
df.loc[:,j]=(j-i[:,None])
哪里:
i=df.cd.values
j=[0,1,2,3,4,5,6]
但是在执行“ column name is <= to df['ddf']
”部分时column name is <= to df['ddf']
。 理想情况下,我们可以一起做。 速度非常重要,因为完整的数据帧非常大,大于100米行, j
长度大约为4,000。
这是使用numpy
广播的一种方式
s1=df.cd.values
s2=df.ddf.values
s=df.columns[3:].values
t=(s1[:,None]-s<=0)&(s2[:,None]-s>=0)
updf=pd.DataFrame(t.cumsum(axis=1),columns=s,index=df.index)
df.update((updf-1).where(t))
df
Out[590]:
id cd ddf 0 1 2 3 4 5 6
0 a 0 2 0.0 1.0 2.0 NaN NaN NaN NaN
1 b 4 5 NaN NaN NaN NaN 0.0 1.0 NaN
2 c 1 2 NaN 0.0 1.0 NaN NaN NaN NaN
3 d 3 5 NaN NaN NaN 0.0 1.0 2.0 NaN
这是一种方式
i=df.cd.values
j=[0,1,2,3,4,5,6]
df.loc[:,j]=(j-i[:,None])
print(df)
for c in j :
for l in range(df.shape[0]) :
if c < df.cd[l] or c > df.ddf[l] :
df[c][l] = np.nan
df
输出:
id cd ddf 0 1 2 3 4 5 6
0 a 0 2 0.0 1.0 2.0 NaN NaN NaN NaN
1 b 4 5 NaN NaN NaN NaN 0.0 1.0 NaN
2 c 1 2 NaN 0.0 1.0 NaN NaN NaN NaN
3 d 3 5 NaN NaN NaN 0.0 1.0 2.0 NaN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.