Python / Pandas-如果另一个行值<列名,则创建行值

时间:2019-08-23 14:25:15

标签: python pandas dataframe

我有一个可以用此创建的数据框:

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。

2 个答案:

答案 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