我的问题围绕在以下外观的Pandas DataFrame中应用逻辑:
ID yyyymm value1 value2 1 201501 0 123 1 201502 1 113 1 201503 3 115 2 201506 0 0 2 201507 0 0 2 201508 1 115 2 201509 0 0 3 201503 0 0 3 201504 0 0 3 201505 0 0
我想要做的是根据yyyymm -variable中时间值的连续顺序来计算每个ID的时间差。我想从每个id的开头开始计数,当value1 > 0时,然后保存时间戳。与value2相同,当它变为> 0时,我想保存时间戳,以下面的表2结尾。
ID time_value1 value1 time_value2 value2 1 1 1 0 123 2 2 1 2 115
我有SAS背景,并且通过组处理直接做到这一点。
下表的代码:
data = pd.DataFrame({'ID':[1,1,1,2,2,2,2,3,3,3],
'yyyymm':[201501,201502,201503,201506,201507,201508,201509,201503,201504,201505],
'value1':[0,1,3,0,0,1,0,0,0,0],
'value2':[123,113,115,0,0,115,0,0,0,0]})
预先感谢您的宝贵时间!
这将按日期排序,按ID分组,并找到value1或value2> 0的行,将该行保存到另一个数据框中,然后移至下一个ID组。如果每个组ID要保存1个以上,只需删除中断
我不知道最终数据帧的“ time_value1”或“ time_value2”列中想要的值,但是您可以轻松地将该变量分配编辑为所需的值
import pandas as pd
data = pd.DataFrame({'ID':[1,1,1,2,2,2,2,3,3,3],
'yyyymm':[201501,201502,201503,201506,201507,201508,201509,201503,201504,201505],
'value1':[0,1,3,0,0,1,0,0,0,0],
'value2':[123,113,115,0,0,115,0,0,0,0]})
final = pd.DataFrame(columns=["ID", "time_value1", "value1", "time_value2", "value2"])
def findTimes(df):
for index, row in df.iterrows():
if row["value1"] > 0 or row["value2"] > 0:
final.loc[index,"ID"] = row["ID"]
final.loc[index,"time_value1"] = row["value1"]
final.loc[index,"value1"] = row["value1"]
final.loc[index,"time_value2"] = row["value2"]
final.loc[index,"value2"] = row["value2"]
break
data.sort_values("yyyymm").groupby("ID").apply(lambda x: findTimes(x))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句