组合数据以在条件下随机创建新数据

时间:2016-03-26 11:49:50

标签: python python-2.7 pandas merge

我遇到了以下我想在python中解决的问题。我想将零件随机分配给具有一定容量的某些容器。下面是一个虚拟数据框(带有pandas)的示例,以显示我想要实现的内容:

dfA =
   Car Container  Capcity_container Container_type
0  CAR1       E-1                  1              E
1  CAR1       A-2                  2              A
2  CAR1       B-2                  1              B
3  CAR1       A-6                  2              A
4  CAR2       B-4                  1              B
5  CAR2       A-1                  4              A
6  CAR2       B-5                  1              B
7  CAR3       C-2                  2              C
8  CAR3       B-8                  1              B
9  CAR3       B-3                  2              B

dfB =
      Part   Car Container_Type
8    Part9  CAR2              B
0    Part1  CAR1              A
1    Part2  CAR1              A
2    Part3  CAR1              B
3    Part4  CAR1              E
9   Part10  CAR1              A
12  Part13  CAR1              A
4    Part5  CAR2              A
5    Part6  CAR2              A
6    Part7  CAR2              A
13  Part14  CAR2              B
7    Part8  CAR3              B
10  Part11  CAR3              B
11  Part12  CAR3              B

在dfA中,已知哪辆车包含具有指定容量的容器的时间。

在dfB中,知道哪个部分需要在哪个车和容器类型中。 汽车所有部件的总和与dfA中容器的容量总和相同。

我的目标:我想将零件随机分配到具有正确类型的容器中。在容器“满”之后,其余部分应该分配给另一个具有正确类型的容器。理想情况下,它将返回如下内容:

result =     
               Part   Car Container_Type Container_assign
    0    Part1  CAR1              A              A-2
    1    Part2  CAR1              A              A-2
    2    Part3  CAR1              B              B-2
    3    Part4  CAR1              E              E-1
    9   Part10  CAR1              A              A-1
    12  Part13  CAR1              A              A-1
    4    Part5  CAR2              A              A-1
    5    Part6  CAR2              A              A-1
    6    Part7  CAR2              A              A-5
    8    Part9  CAR2              B              B-2
    13  Part14  CAR2              B              B-5
    7    Part8  CAR3              B              B-8
    10  Part11  CAR3              B              B-8
    11  Part12  CAR3              B              B-3

请注意,只要满足容量要求且部件属于正确类型的容器和右车/ ULD ,就可以在容器上随机分配它们

**编辑#2 ** @Colonel Beauvel:这是你的代码,在我深入尝试功能后稍微调整一下,这对我来说是全新的。

for i, r in dfB.iterrows():
    mask = (dfA['count']!=0) & (dfA['Container_type']==r['Container_Type']) & (dfA['CAR']==r['CAR'])
    df   = dfA[mask]
    try:
        l.append(df.iloc[0]['Container'])
        dfA.ix[df.index[0],'count'] = dfA.ix[df.index[0],'count'] - 1
    except Exception as e:
        l.append('Not Assigned')

dfB['Container_assign']=l

返回:

      Part   CAR Container_Type Container_assign
0    Part9  CAR2              B              B-4
1    Part1  CAR1              A              A-2
2    Part2  CAR1              A              A-2
3    Part3  CAR1              B              B-2
4    Part4  CAR1              E              E-1
5   Part10  CAR1              A     Not Assigned
6   Part13  CAR1              A     Not Assigned
7    Part5  CAR2              A              A-1
8    Part6  CAR2              A              A-1
9    Part7  CAR2              A              A-1
10  Part14  CAR2              B              B-5
11   Part8  CAR3              B              B-8
12  Part11  CAR3              B              B-3
13  Part12  CAR3              B              B-3

出于示例目的,我将A-6的容量更改为零,以便获得2个未被分配的部件。有效!

  Container   CAR  Capcity_container Container_type  count
0       E-1  CAR1                  1              E      0
1       A-2  CAR1                  2              A      0
2       B-2  CAR1                  1              B      0
3       A-6  CAR1                  0              A      0
4       B-4  CAR2                  1              B      0
5       A-1  CAR2                  4              A      1
6       B-5  CAR2                  1              B      0
7       C-2  CAR3                  2              C      2
8       B-8  CAR3                  1              B      0
9       B-3  CAR3                  2              B      0

如何使用else或最终打印“所有部件都被分配”之类的容量符合部件数量并且所有内容都被合并,换句话说,没有错误?当我添加它时,它会返回每个部分的内容。 编辑#3

我认为这样做很简单......

l = []
dfA['count'] = dfA['Capcity_container']
erroryesno = 'All parts are Assinged'
for i, r in dfB.iterrows():
    mask = (dfA['count']!=0) & (dfA['Container_type']==r['Container_Type']) & (dfA['CAR']==r['CAR'])
    df   = dfA[mask]
    try:
        l.append(df.iloc[0]['Container'])
        dfA.ix[df.index[0],'count'] = dfA.ix[df.index[0],'count'] - 1
    except Exception as e:
        l.append('Not Assigned')
        erroryesno = 'Some are not assinged'
print erroryesno
dfB['Container_assign']=l

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是遍历private void resetAudioPlayback() { ViewGroup.LayoutParams params = playbackView.getLayoutParams(); params.width = 0; playbackView.setLayoutParams(params); audioTrack.stop(); audioTrack.reloadStaticData(); playImage.animate().alpha(100).setDuration(500).start(); } 行并获取dfB中可用的第一个相应容器。因此容器容量减少了一个:

dfA