python - 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。
解决方案
这是使用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
推荐阅读
- java - android的webview显示空白屏幕
- webhooks - 使用来自 alexa 的 dialogflow webhook
- xamarin.forms - Xamarin Forms 自定义视图不在真正的 Android 设备上呈现
- c# - 如何在 AppMetrics 中将 SlidingWindow 更改为秒
- javascript - .addEventListener('click', classToggle) 在触摸设备上不起作用
- java - 具有gwt和可序列化的抽象类?
- javascript - 如何验证动态创建的 Checkboxlist 和 RadioButtonlist
- tomcat - 负载测试增加 CPU 利用率和服务器停止响应
- javascript - 在 Angular 6 中等待异步函数
- android - AndroidX 中“AppBarLayout$ScrollingViewBehavior”的替代方法是什么?