我在csv中为数据加上时间戳,分辨率为10分钟as shown in this image。每个时间戳都有一个" id"这是1或0.我正在尝试创建一个新列," time",如果" id"则返回0 = 0,否则它应该返回" time"的值在下一行加上10.我可以在Excel上轻松完成,我使用的公式显示在图像中。
我正在尝试使用Python来做同样的事情。使用pandas将csv数据导入为数据框后,我查看了this link和this link。我复制了" id"列到新列,"时间"并使用以下代码,但" time"的值保持完全相同(1或0)。
for i, e in enumerate(df['time']):
if e==1:
df.at[i,'time']=df.at[i+1,'time']+10
根据第一个链接中的解决方案,我尝试更改' 1'使用if pd.isnull(e)
并使用TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
,但最终得到i+1
。
我通过反向排序行再次尝试了它,将i-1
更改为KeyError: -1
但它也没有工作,我得到了object
。
有没有人对如何在Python中执行此操作有任何建议?
修改
道歉,我可能没有很好地解释我的问题。我已经想出如何获得我想要的解决方案。我意识到问题是由于" id"的dtypes和"时间"都是KeyError: -1
。通过反向排序行并为" time"分配值来解决#sort timestamp in reverse
df=df.sort_values(by="timestamp",ascending=False)
#change dtype object to int64
df['id']=df['id'].astype(np.int64)
df['time']=df['id']
#assigning value to "time" in first row
if df.loc[0,'time']==0:
df.set_value(0,'time',0)
else:
df.set_value(0,'time',999999)
#using the previous row's value to evaluate "time"
for i, e in enumerate(df['time']):
if e==1:
df.at[i,'time']=df.at[i-1,'time']+10
#sort timestamp back in ascending order
df=df.sort_values(by="timestamp")
问题。如果它不等于0,则在第一行中。我将忽略第一行之前的任何行" id"为0,所以我使用了999999。
解决方案:
$('p').filter(function() {
var nodetoCheck = $(this).contents()[0];
if ($(this).contents()[0].nodeValue.trim() === '') {
nodetoCheck = $(this).contents()[1];
}
if (nodetoCheck.nodeType === 1) {
return true;
}
}).addClass('selected');
答案 0 :(得分:0)
这应该可以解决问题,但您没有说明如何处理将在您的问题中出现的NaN
值
import pandas as pd
df = pd.DataFrame({'id':[1,1,0,0,1,0,1], 'nums':[10,20,50,10,10,30,20]})
id nums
0 1 10
1 1 20
2 0 50
3 0 10
4 1 10
5 0 30
6 1 20
df['nums'] = pd.concat([df, df['nums'].shift(-1)], axis=1).apply(lambda x: 0 if x['id'] == 0 else x[[2]]+10, axis=1)
id nums
0 1 30.0
1 1 60.0
2 0 0.0
3 0 0.0
4 1 40.0
5 0 0.0
6 1 NaN
如果您想填充fillna(0)
值,可以在单行的末尾添加NaN
。