从一个数据帧到另一个数据帧通过rank使用循环赋值



我有两个数据帧

df1 = pd.DataFrame.from_dict({'Qty': ['1', '2', '3', '4', '5', '6', '7'], 'Count': [2,1,5,5,6,1,1]})
print(df1)
Qty  Count
0   1      2
1   2      1
2   3      5
3   4      5
4   5      6
5   6      1
6   7      1
df2 = pd.DataFrame.from_dict({'id': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'Score': [10,9,8,7,6,5,4]})
print(df2)
id  Score
0  A     10
1  B      9
2  C      8
3  D      7
4  E      6
5  F      5
6  G      4

我需要的是将df1的最高数量分配给使用得分最高的id的df2,但该id只能分配3次。

这是我所期望的

df3 = pd.DataFrame.from_dict({'id': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'Score': [10,9,8,7,6,5,4], 'Assigns': [[7,6,5],[5,5,5],[5,5,4],[4,4,4],[4,3,3],[3,3,3], [2,2,1] ]})
print(df3)
id  Score    Assigns
0  A     10  [7, 6, 5]
1  B      9  [5, 5, 5]
2  C      8  [5, 5, 4]
3  D      7  [4, 4, 4]
4  E      6  [4, 3, 3]
5  F      5  [3, 3, 3]
6  G      4  [2, 1, 1]

有人知道怎么做吗?由于

试试这样:

df2['Assigns'] = pd.Series(df1['Qty'].reindex(df1.index.repeat(df1['Count']))[::-1].to_numpy().reshape(-1,3).tolist())
df2

输出:

id  Score    Assigns
0  A     10  [7, 6, 5]
1  B      9  [5, 5, 5]
2  C      8  [5, 5, 4]
3  D      7  [4, 4, 4]
4  E      6  [4, 3, 3]
5  F      5  [3, 3, 3]
6  G      4  [2, 1, 1]

细节:

  • df1.index.repeat(df1['Count'])——重复数据帧的索引行df1['count']的次数
  • reindex用这些重复值建立一个新的序列上一条语句
  • 中的索引
  • 使用反向元素[::-1]从最后到第一个
  • 然后使用pd.Series构造器构建一个新的pandas系列

最新更新