首页 > 解决方案 > Python / Pandas - 如果另一个行值<列名,则创建行值

问题描述

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

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']AND 列名是 <= 到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']”部分时遇到了问题。理想情况下,我们可以一起做。速度将非常重要,因为完整的数据帧非常大,行数超过 100m,j长度约为 4,000。

标签: pythonpandasdataframe

解决方案


这是使用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

推荐阅读