根据优先级和特定行数拆分数据框

Split a dataframe according to priorities and specific number of rows

我想根据优先级列将一个数据帧拆分为 3 个新的数据帧。我的数据框如下:

      City         Priority
0   New York         3       
1   Paris            1
2   Boston           7
3   La Habana        6
4   Bilbao           10
5   Roma             2
6   Barcelona        1
7   Bruselas         8
8   Tokyo            7
9   Caracas          11

有 3 种类型的优先级:

我们的想法是使用以下结构将此数据帧分成 3 份,然后按其优先级值排序:

结果如下:

数据框 1:

      City         Priority
0   Boston           7       
1   Tokyo            7
2   Bruselas         8

数据框 2:

      City         Priority
0   Paris            1       
1   Barcelona        1
2   Roma             2
3   New York         3
4   La Habana        6

数据框 3:

      City         Priority
0   Bilbao           10       
1   Caracas          11

我认为重要的是要注意,如果没有优先级 7 到 9 的行,则为 3 的数据帧选择的优先级数字将是 10,如果不是 11,如果不是 1,如果不是2 等。与其余数据帧和优先级相同:第二个为 1、2、3、4 等,第三个为 10、11、1、2、3 等。

此外,如果有 4 个值,例如 7、7、7、8,则只有第 7、7、7 行会出现在 3 行 Dataframe 中,而值为 8 的行会出现在 Dataframe 2 中。

同样,我认为同样重要的是,在该迭代中,当生成 3 行的第一个数据帧时,应从原始数据帧中“提取”它们,以便在生成时不考虑它们其他数据框。我希望我已经很好地解释了自己,并且有人可以帮助我。致以最诚挚的问候和感谢!

IIUC 这应该按预期工作:

(1) 您创建了一个列 bin_Priority,它将每一行应用于正确的 bin,bin 的标签是查找它们的优先顺序。

(2) sort_valuesbin_Priority,然后在 Priority.

的每个 bin 中

(3) split 你的 df 变成 3 df's,第一个有 3 行,第二个有 2 行,第三个有 5 行。 如果缺少优先级组的值,它会选择正确的值,因为它们的顺序是正确的。

如果这就是您要搜索的内容,请告诉我。

df = pd.DataFrame({
    'City': ['New York','Paris','Boston','La Habana','Bilbao','Roma','Barcelona','Bruselas','Tokyo','Caracas'],
    'Priority': [3, 1, 7, 6, 10, 2, 1, 8, 7, 11]
})

#(1)
df['bin_Priority'] = pd.cut(df['Priority'], bins=[0,6,9,11], labels=[3, 1, 2]).to_numpy()

#(2)
ordered_priority_df = df.sort_values(by=['bin_Priority', 'Priority'])

#(3)
out = np.split(ordered_priority_df, [3,5])

print(df, ordered_priority_df, *out, sep='\n\n')

#df
        City  Priority  bin_Priority
0   New York         3             3
1      Paris         1             3
2     Boston         7             1
3  La Habana         6             3
4     Bilbao        10             2
5       Roma         2             3
6  Barcelona         1             3
7   Bruselas         8             1
8      Tokyo         7             1
9    Caracas        11             2

#ordered_priority_df
        City  Priority  bin_Priority
2     Boston         7             1
8      Tokyo         7             1
7   Bruselas         8             1
4     Bilbao        10             2
9    Caracas        11             2
1      Paris         1             3
6  Barcelona         1             3
5       Roma         2             3
0   New York         3             3
3  La Habana         6             3

# out[0]
       City  Priority  bin_Priority
2    Boston         7             1
8     Tokyo         7             1
7  Bruselas         8             1

# out[1]
      City  Priority  bin_Priority
4   Bilbao        10             2
9  Caracas        11             2

# out[2]
        City  Priority  bin_Priority
1      Paris         1             3
6  Barcelona         1             3
5       Roma         2             3
0   New York         3             3
3  La Habana         6             3

这是我将巴黎的值从 1 更改为 7 的示例。值 8(应该在第一个 df 中)在第二个 df 中结束,与值 11(从第二到第三)相同。

df = pd.DataFrame({
    'City': ['New York','Paris','Boston','La Habana','Bilbao','Roma','Barcelona','Bruselas','Tokyo','Caracas'],
    'Priority': [3, 7, 7, 6, 10, 2, 1, 8, 7, 11]
})

df['bin_Priority'] = pd.cut(df['Priority'], bins=[0,6,9,11], labels=[3, 1, 2]).to_numpy()

ordered_priority_df = df.sort_values(by=['bin_Priority', 'Priority'])

out = np.split(ordered_priority_df, [3,5])

print(df, *out, sep='\n\n')

        City  Priority  bin_Priority
0   New York         3             3
1      Paris         7             1
2     Boston         7             1
3  La Habana         6             3
4     Bilbao        10             2
5       Roma         2             3
6  Barcelona         1             3
7   Bruselas         8             1
8      Tokyo         7             1
9    Caracas        11             2

     City  Priority  bin_Priority
1   Paris         7             1
2  Boston         7             1
8   Tokyo         7             1

       City  Priority  bin_Priority
7  Bruselas         8             1
4    Bilbao        10             2

        City  Priority  bin_Priority
9    Caracas        11             2
6  Barcelona         1             3
5       Roma         2             3
0   New York         3             3
3  La Habana         6             3