【问题标题】:Calculation for each row of df计算每行df
【发布时间】:2020-11-03 14:50:31
【问题描述】:

我有一个 >150,000 行的数据框,类似于

|   ID  |   CATEGORY    |   START_DATE      |   END_DATE        |   NEW_COL_I_WANT_TO_ADD   |
|   0   |   A           |   01/07/2020      |   02/07/2020      |   1                       |
|   1   |   A           |   28/06/2020      |   null            |   0                       |
|   2   |   B           |   28/06/2020      |   29/06/2020      |   0                       |

我想为每一行添加一列 i 我有特定条件下所有(不同)记录的计数:

(1) CATEGORY[i] == CATEGORY[j] 
(2) & START_DATE[j] <= START_DATE[i]
(3) & END_DATE[j] null | END_DATE[j] > END_DATE[I]

所以新列COUNT 将包含所有具有相同类别的记录j 的计数 (1),在 (2) 之前开始并在 (3) 之后结束(基本上是待处理记录的数量 @987654326 @在创建i的时刻),对于ID 0的记录是1

如何有效地为每一行执行此操作?

我尝试将 df.apply(lambda record: df[filtered_according_to_conditions].count(), axis=1) 分配给新列,但它似乎不起作用。

【问题讨论】:

  • 我不确定你想要什么。您能否提供一些示例数据以及您想要的输出类型?
  • 你能解释一下索引 i 和 j 之间的关系吗?即:i = j - 5 ?
  • 我编辑了问题以更具体地说明操作的含义
  • @Chernabog 这里j 第行指的是i + 1,对吗?还是可以是同一类别的任何行?
  • 完全是@ShubhamSharma。

标签: python python-3.x pandas dataframe


【解决方案1】:

df.apply 似乎应该可以工作。对于每条记录,您可以对表的其余部分执行布尔运算以生成 bool 向量,然后将 True 值的数量相加(计数)以确定匹配其他行的数量。

import pandas as pd
from io import StringIO

# Sample Data
df = pd.read_csv(StringIO("""
ID|CATEGORY|START_DATE|END_DATE
0|A|2020-07-01|2020-07-02
1|A|2020-06-28|null
2|B|2020-06-28|2020-06-29
"""), sep='|', parse_dates=['START_DATE', 'END_DATE'])

df['NEW_COL_I_WANT_TO_ADD'] = df.apply(
    lambda record: (
        (df['ID'] != record['ID']) & # Not the current record
        (record['CATEGORY'] == df.CATEGORY) &  # condition 1
        (df.START_DATE <= record.START_DATE) & # condition 2
        (df.END_DATE.isnull() | (df.END_DATE > record.END_DATE)) # etc.
    ).sum(), # sum() will count number of items that match all conditions
    axis=1
)

print(df)

结果:

ID CATEGORY START_DATE   END_DATE  NEW_COL_I_WANT_TO_ADD
 0        A 2020-07-01 2020-07-02                      1
 1        A 2020-06-28        NaT                      0
 2        B 2020-06-28 2020-06-29                      0

【讨论】:

  • 我在 150,000 行上尝试了这个,需要 25 分钟。似乎需要一种更有效的方法。
  • 确实,申请对我来说需要更长的时间
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2019-06-24
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多