根据三列的值有条理地和交互地计算列

时间:2016-01-14 20:31:49

标签: python function python-2.7 pandas logic

我通过Spyder IDE运行Windows 10,Python 2.7。

我有一只叫DataFrame的大熊猫df

df = pd.DataFrame({'fld1': ['x', 'x', 'x','y','y','y','z','z']
                , 'fld2': ['x', 'y', 'z','x','y','z','x','y']
                , 'relationship': [.25,.25,.50,.33,.33,.33,.5,.5]})

df
 Out[172]: 
  fld1 fld2  relationship
 0    x    x          0.25
 1    x    y          0.25
 2    x    z          0.50
 3    y    x          0.33
 4    y    y          0.33
 5    y    z          0.33
 6    z    x          0.50
 7    z    y          0.50

我想构建一个function来迭代Dataframe df的行,以在df中生成一个新列。

此功能将从以下开始:

第1步:在relationship = fld1x = fld2的{​​{1}}列中,然后

第2步:检查x = fld1的案例是否还有x的唯一值。

第3步:如果存在与fld2 = fld2相关联的fld1的另一个唯一值(此处存在两个更独特的值,{{1} }和x),将第1步x值添加到y = relationship的{​​{1}}列,并且relationship的下一个唯一值(在此示例中为fld1 = x是下一个唯一值)乘以关系的倒数(在本例中为fld2 = {{1 }}和fld2 = y

第4步:重复第2步,直到计算出fld1 y = fld2 x的所有唯一值方式

第4步:重复第1步,获取fld2的下一个唯一值。在这种情况下,它将是fld1 = x

以另一种方式解释此功能逻辑,下面是fld1中如何完成此操作的示例:

fld1

该函数的输出应该生成与y相同的excel

        A       B         C             D
   1    fld1    fld2      relationship  Connection
   2    x        x         0.25         =C2+(C3*C5)+(C4*C8)
   3    x        y         0.25         =C3+(C4*C9)
   4    x        z         0.5          =C4+(C3*C7)
   5    y        x         0.33         =C5+(C7*C8)
   6    y        y         0.33         =C6+(C5*C3)+(C7*C9)
   7    y        z         0.33         =C7+(C5*C4)
   8    z        x         0.5          =C8+(C9*C5)
   9    z        y         0.5          =C9+(C8*C4)

1 个答案:

答案 0 :(得分:1)

好的,这是解决问题的一种方法。我使用字典来保存每个组合的值。

Profunctor

然后,对于每个&#39;连接&#39;组合,第一个字母始终与extension Work { func diMap<A, B>(fa: A -> Input, fb: Output -> B) -> Work<A, B> { return Work<A, B> { arg in let input = fa(arg) let output = self.work(input) return fb(output) } } } 的第一个字母相同。第二个字母始终为xyzdict = {"xx":0.25, "xy":0.25, "xz":0.5, "yx":0.33, "yy":0.33, "yz":0.33, "zx":0.5, "zy":0.5} fld1。所以这里有一个详尽的,也许不是pythonic的方法来计算你的价值和存储组合&#39;字典中的连接值供以后使用。

not

几乎在那里,定义一个函数fld1,它将提取您的cnxn = {} xyz = ["x","y","z"] for combo in xyzdict.keys(): #print "the combo is %s" % (combo) #xyzdict[two] #actual value first_letter = combo[0] not_second = [combo[0],combo[1]] not_second_letter = list(set(xyz) - set(not_second)) if len(not_second_letter) > 1: multi_cnxn = [] for each_not_second_letter in not_second_letter: fwd = ''.join((first_letter,each_not_second_letter)) rev = ''.join((each_not_second_letter,first_letter)) cnxnval = xyzdict[fwd] * xyzdict[rev] multi_cnxn.append(cnxnval) rowvalue = xyzdict[combo] + sum(multi_cnxn) cnxn[combo] =rowvalue else: fwd = ''.join((first_letter,not_second_letter[0])) rev = ''.join((not_second_letter[0],first_letter)) cnxnval = xyzdict[fwd] * xyzdict[rev] rowvalue = xyzdict[combo] + cnxnval cnxn[combo] = rowvalue check并返回上面fld1的计算值。

fld2

最后,小熊猫cnxn将它带回家。

def check(fld1,fld2,cnxn_sub):
    rowpair = ''.join((fld1,fld2))
    return cnxn_sub[rowpair]

以下是我的结果,我们的&#34; yz&#34;连接有点偏,如果你的结尾还是我的话,就等了......

apply

祝你好运!