【问题标题】:Shuffling pandas DataFrame rows if the values "overlap" between two columns如果两列之间的值“重叠”,则对 pandas DataFrame 行进行洗牌
【发布时间】:2017-06-26 01:39:32
【问题描述】:

我有以下熊猫数据框

import numpy as np
import pandas as pd

df = pd.DataFrame({"first_element":[20, 125, 156, 211, 227, 220, 230, 472, 4765], "second_element":[35, 145, 178, 233, 321, 234, 231, 498, 8971], "next":[0.32, 0.04, 0.59, 0.103, 0.37, 0.92, 0.81, 0.24, 0.77]})
df = df[["first_element", "second_element", "next"]]

print(df)
### print(df) outputs:
    first_element  second_element   next
0             20              35  0.320
1            125             145  0.040
2            156             178  0.590
3            211             233  0.103
4            227             321  0.370
5            220             234  0.920
6            230             231  0.810
7            472             498  0.240
8           4765            8971  0.770

在这个 DataFrame 中,每一行都被认为是沿着一条实线的“间隔”,[first_element, second_element],例如20 到 35、125 到 145。

如果我想根据两列对df 进行排序,我会使用.sort_values(),即

sorted_df = df.sort_values(["first_element", "second_element"], ascending=[True, False])

哪个输出

print(sorted_df)
    first_element  second_element   next
0             20              35  0.320
1            125             145  0.040
2            156             178  0.590
3            211             233  0.103
5            220             234  0.920
4            227             321  0.370
6            230             231  0.810
7            472             498  0.240
8           4765            8971  0.770

有几个相交/重叠的区间,即[211, 233], [220, 234], [227, 321], [230, 231]。因为[230, 231][211, 233] 的子集,所以有几种方法可以订购这两者。

我的目标是 (1) 编写一个函数来查找所有重叠的“区间”(first_elementsecond_element 两列中的值)和 (2) 随机打乱这些区间。

目标 (2) 听起来很棘手,因为需要分别对重叠间隔的多个“组”进行洗牌/重新排序。例如,假设我们的数据框更大,并且有以下重叠间隔:

[211, 233], [220, 234], [227, 321], [230, 231], [5550, 5879], [5400, 5454]

我想分别重新洗牌 [211, 233], [220, 234], [227, 321], [230, 231][5550, 5879], [5400, 5454],而不是混淆重叠区间的子集。

有几种方法可以用 pandas 打乱行,例如按索引随机播放

def shuffle_by_index(df):
    index = list(df.index)
    random.shuffle(index)
    df = df.ix[index]
    df.reset_index()
    return df

或使用sklearn

import sklearn.utils
shuffled = sklearn.utils.shuffle(df)
df = df.reset_index(drop=True)

但是 (1) 如何以 pythonic/pandas 的方式搜索所有重叠区间以及 (2) 我如何选择这些重叠区间的子集并仅单独打乱它们?

【问题讨论】:

    标签: sorting pandas dataframe intersection overlap


    【解决方案1】:

    这不是解决问题的最佳方法,但它可以提供您想要的结果。我把第二部分留给你了。

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({"first_element":[20, 125, 156, 211, 227, 220, 230, 472, 4765], "second_element":[35, 145, 178, 233, 321, 234, 231, 498, 8971], "next":[0.32, 0.04, 0.59, 0.103, 0.37, 0.92, 0.81, 0.24, 0.77]})
    df = df[["first_element", "second_element", "next"]]
    
    sorted_df = df.sort_values(["first_element", "second_element"], ascending=[True, False])
    sorted_df.reset_index(0, inplace = True)
    
    prev_min = sorted_df.first_element.iloc[0]
    prev_max = sorted_df.second_element.iloc[0]
    
    labels = []
    label_counter = 1
    labels.append(label_counter)
    
    for rowIndex in xrange(1, sorted_df.shape[0]):
        row = sorted_df.iloc[rowIndex]
    
        if row.first_element > prev_max:
            # totally different interval, may be overlapping interval
            prev_min = row.first_element
            prev_max = row.second_element
            label_counter += 1
            labels.append(label_counter)
        elif row.first_element >= prev_min:
            prev_max = max(prev_max, row.second_element)
            labels.append(label_counter)
    
    sorted_df['overlapping_index'] = labels
    
    # group sorted_df by overlapping index, and randomly select the save interval group
    

    【讨论】:

    • 我知道最后一行代码输出了一个所有重叠间隔的熊猫数据帧。我不确定如何(1)将它们分成单独的相交区间组,以及(2)随机打乱这些索引,以便最终输出是原始数据帧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2022-08-19
    • 2023-03-24
    相关资源
    最近更新 更多