我通过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
= fld1
和x
= 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)
答案 0 :(得分:1)
好的,这是解决问题的一种方法。我使用字典来保存每个组合的值。
Profunctor
然后,对于每个'连接'组合,第一个字母始终与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
祝你好运!