繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM