【发布时间】:2020-11-09 03:45:38
【问题描述】:
我正在使用 python 3.7 和 pandas 1.0.1
我正在尝试根据前两列的结果在我的数据框中填充一列。
我有一个日期列、一个 In 列(在活动开始时注册)和 Out 列(在活动结束时注册)。
我需要一个 Res 列,它将记录活动的总持续时间。
首先我有这个简单的数据框:
data = {'date':['2020-01-01','2020-01-02','2020-01-03','2020-01-04','2020-01-05','2020-01-06','2020-01-07','2020-08-01','2020-01-09','2020-01-10'],
'in':[0,0,1,0,0,0,0,1,0,0],
'out':[0,0,0,0,0,1,0,0,1,0]}
df = pd.DataFrame(data, columns=['date','in','out'])
print(df)
生成的数据框如下:
date in out
0 2020-01-01 0 0
1 2020-01-02 0 0
2 2020-01-03 1 0
3 2020-01-04 0 0
4 2020-01-05 0 0
5 2020-01-06 0 1
6 2020-01-07 0 0
7 2020-08-01 1 0
8 2020-01-09 0 1
9 2020-01-10 0 0
我想要达到的结果是这样的:
date in out res
0 2020-01-01 0 0 0
1 2020-01-02 0 0 0
2 2020-01-03 1 0 1
3 2020-01-04 0 0 1
4 2020-01-05 0 0 1
5 2020-01-06 0 1 1
6 2020-01-07 0 0 0
7 2020-08-01 1 0 1
8 2020-01-09 0 1 1
9 2020-01-10 0 0 0
我可以使用 iterrows 做到这一点:
result = 0
for index, row in df.iterrows():
if (row['in']==1):
result = 1
elif (df['out'].shift(1)[index]==1):
result = 0
df.at[index,'res'] = result
但在处理非常大的数据帧时,迭代的时间效率不是很高。
我怎样才能更好地解决这个问题?
【问题讨论】:
-
类似:
df['res'] = np.where(df['in'].eq(1), 1, np.where(df['out'].shift(1).eq(1), 1, 0), 0? -
很抱歉,我无法让它工作......但是函数 .eq 是我会尝试更频繁地使用的东西,因为我不知道它......谢谢你:)
标签: python pandas performance dataframe