【问题标题】:Pandas cumulative count by looking at if two lists have common valuePandas 通过查看两个列表是否具有共同值来累积计数
【发布时间】:2020-03-01 03:13:03
【问题描述】:

如果我有这样的桌子

|---------------------|------------------|
|      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         |
|---------------------|------------------|---------------------|

我目前拥有的数据集比较大,我想获得帮助以快速处理这些数据。非常感谢!

【问题讨论】:

    标签: string pandas match cumulative-sum


    【解决方案1】:

    一种方法是将列表转换为集合并在 list of string 上使用 listcomp 并将 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
    

    【讨论】:

    • 非常感谢。但是,如果相同的时间戳存在于多行中,我需要获取在比较当前行之前发生的行的计数。我将如何修改代码?
    • 但在这种情况下,[D] 的行应该是 1,因为它的time[A, C] 的行相同?
    • 对于带有[D]的行,只有第一行可以比较(2019-06-18 09:05:00在2019-06-19 09:05:00之前)。所以因为 [A, B, C] 和 [D] 没有共同的值,所以带有 [D] 的行的结果是 0。
    • @M.Cong:哈哈!我现在不明白。只是一个微小的变化。我编辑了答案。检查我的更新
    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 2017-05-15
    • 2023-03-20
    • 2018-12-04
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多