我有一个可以用此创建的数据框:
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']的列名之间的差->如果列名> =到{ {1}},列名是<=到df['cd']
。生成的df['ddf']
应该看起来像:
df
我已成功使用以下命令填充了IF子句的第一部分:
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
其中:
df.loc[:,j]=(j-i[:,None])
但是在执行“ i=df.cd.values
j=[0,1,2,3,4,5,6]
”部分时遇到了问题。理想情况下,我们可以一起做。速度将非常重要,因为整个数据帧在大于100m的行中非常大,并且column name is <= to df['ddf']
的长度约为4,000。
答案 0 :(得分:2)
这是使用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
答案 1 :(得分:1)
这是一种方法
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