Панда кумулятивный подсчет, посмотрев, если два списка имеют общее значение - PullRequest
2 голосов
/ 04 ноября 2019

Если у меня есть такая таблица

|---------------------|------------------|
|      time           | list of string   |
|---------------------|------------------|
| 2019-06-18 09:05:00 |   ['A', 'B', 'C']|
|---------------------|------------------|
| 2019-06-19 09:05:00 |   ['A', 'C']     |
|---------------------|------------------|
| 2019-06-19 09:05:00 |   ['B', 'C']     |
|---------------------|------------------|
| 2019-06-20 09:05:00 |   ['C']          |
|---------------------|------------------|
| 2019-06-20 09:05:00 |   ['A', 'B', 'C']|
|---------------------|------------------|

Для каждой строки я хотел бы знать, сколько строк до текущей временной метки имеют хотя бы одно общее значение в текущем списке строк.

Медленный код будет выглядеть примерно так:

results = [] for i in range(len(df)):
    current_t = df['time'].iloc[i]
    current_string = df['list_of_string'].iloc[i]
    df_before_t = df[df['time']<current_t]
    cumm_count = 0
    for row in df_before_t['list_of_string']:
        if (set(current_string) & set(row)):
            cumm_count += 1
    results.append(cumm_count)

Таким образом, таблица результатов будет иметь вид:

|---------------------|------------------|---------------------|
|      time           | list of string   |   result            |
|---------------------|------------------|---------------------|
| 2019-06-18 09:05:00 |   ['A', 'B', 'C']|           0         |
|---------------------|------------------|---------------------|
| 2019-06-19 09:05:00 |   ['A', 'C']     |           1         |
|---------------------|------------------|---------------------|
| 2019-06-19 09:05:00 |   ['D']          |           0         |
|---------------------|------------------|---------------------|
| 2019-06-20 09:05:00 |   ['C']          |           2         |
|---------------------|------------------|---------------------|
| 2019-06-20 09:05:00 |   ['A', 'B', 'C']|           2         |
|---------------------|------------------|---------------------|

Набор данных, который у меня сейчас есть, относительно большой, и я быхотел бы получить помощь для быстрой обработки этих данных. Большое спасибо!

1 Ответ

0 голосов
/ 04 ноября 2019

Один из способов - преобразовать списки в наборы и использовать listcomp на list of string и сравнить с time с теми, которые меньше текущего time

s = df['list of string'].map(set)
t = pd.to_datetime(df.time)

df['result'] = [sum(len(x & y) != 0 for y in s[t.iloc[i] > t]) 
                                        for i,x in enumerate(s)]

Out[283]:
                  time list of string  result
0  2019-06-18 09:05:00      [A, B, C]       0
1  2019-06-19 09:05:00         [A, C]       1
2  2019-06-19 09:05:00            [D]       0
3  2019-06-20 09:05:00            [C]       2
4  2019-06-20 09:05:00      [A, B, C]       2
...