使用另一个pandas DF的min值中的id填充pandas列

时间:2018-02-03 19:55:54

标签: python pandas for-loop dataframe

我希望遍历orders列表,并为每个订单分配一个所有者idid位于单独的pandas dataframe中(我也尝试将其更改为SeriesOrderedDict。我想找到{{1}中的最小值并将其用于df中的第一个order,然后将orders s id的计数加1,并重复直到所有订单都被填充。< / p>

可重复示例:

count

所有者:

df = pd.DataFrame({'Id':['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], 'count':[2, 3, 5, 6, 8, 9, 12, 13, 15, 55]})
orders = pd.DataFrame({'order_id':['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', 'a11', 'a12', 'a13']})
orders['newowner'] = ""

订单:

df
  Id  count
0  a      2
1  b      3
2  c      5
3  d      6
4  e      8
5  f      9
6  g     12
7  h     13
8  i     15
9  j     55

预期结果:

   order_id newowner
0        a1         
1        a2         
2        a3         
3        a4         
4        a5         
5        a6         
6        a7         
7        a8         
8        a9         
9       a10         
10      a11         
11      a12         
12      a13         

我已经尝试找到 order_id newowner 0 a1 a # brings a up to 3 records 1 a2 a # a and b are tied with 3, so it goes to a again (doesn't matter which gets it first) 2 a3 b # now b has 3, and a has 4, so it goes to b 3 a4 a # both have 4 so a 4 a5 b # etc. 5 a6 a 6 a7 b 7 a8 c 8 a9 a 9 a10 b 10 a11 c 11 a12 a 12 a13 b 的分钟,并尝试遍历每个分段,但我很难隔离每个命令。

df.count

2 个答案:

答案 0 :(得分:2)

以下是df.apply的一种方式:

def set_owner(order_id):
    min_idx = df['count'].idxmin()
    df.loc[min_idx, 'count'] += 1
    return df.loc[min_idx, 'Id']

orders['newowner'] = orders['order_id'].apply(set_owner)

orders
#    order_id newowner
# 0        a1        a
# 1        a2        a
# 2        a3        b
# 3        a4        a
# 4        a5        b
# 5        a6        a
# 6        a7        b
# 7        a8        c
# 8        a9        a
# 9       a10        b
# 10      a11        c
# 11      a12        d
# 12      a13        a

df
#   Id  count
# 0  a      8
# 1  b      7
# 2  c      7
# 3  d      7
# 4  e      8
# 5  f      9
# 6  g     12
# 7  h     13
# 8  i     15
# 9  j     55

答案 1 :(得分:1)

我不确定这是我做的方式。如果可能的话,我可能会寻找一种方法来使用df.apply。但我认为这段代码会给你预期的结果。

for idx, order in orders.iterrows():
    idxmin = df['count'].idxmin()
    df.loc[idxmin, 'count'] += 1
    order['newowner'] = df.loc[idxmin,'Id']