【问题标题】:Better way to fill a dataframe column than iterrows - python + pandas填充数据框列比 iterrows 更好的方法 - python + pandas
【发布时间】: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


【解决方案1】:

让我们在这里尝试一些简单的算术:

t = df['in'] + df['out']  
t.cumsum().where(t.eq(0), 1).eq(1).astype(int)

0    0
1    0
2    1
3    1
4    1
5    1
6    0
7    1
8    1
9    0
dtype: int64

【讨论】:

  • 嘿...这很聪明...我永远不会想出这样的解决方案...非常感谢您的帮助.. :)
猜你喜欢
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2020-11-26
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多