gpt4 book ai didi

python - 根据三列的值有条件地交互式计算列

转载 作者:太空宇宙 更新时间:2023-11-03 17:03:35 26 4
gpt4 key购买 nike

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

我有一只 Pandas DataFramedf :

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 的行dfdf 中生成一个新列.

该函数的启动方式为:

第 1 步:获取 relationship列在哪里fld1 =xfld2 =x然后

第 2 步:检查情况是否符合 fld1 =x具有更多唯一值 fld2

第 3 步:如果 fld2 有另一个唯一值与 fld1 相关=x (其中存在两个唯一值, xy ),添加 relationship步骤 1relationship 的值fld1栏目=x以及 fld2 的下一个唯一值(在本例中 fld2 = y 是下一个唯一值)乘以关系的倒数(在本例中 fld1 = yfld2 = x )

第 4 步:重复第 2 步,直到 fld2 的所有唯一值与 fld1 =x已经这样计算了

第 4 步:重复第 1 步获取下一个唯一值 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)

该函数的输出应产生 Dataframedf2 相同如下:

df2 = 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]
, 'connection': [.5825,0.5,0.5825,0.495,0.5775,0.495,0.665,0.75]})

df2
Out[174]:
connection fld1 fld2 relationship
0 0.5825 x x 0.25
1 0.5000 x y 0.25
2 0.5825 x z 0.50
3 0.4950 y x 0.33
4 0.5775 y y 0.33
5 0.4950 y z 0.33
6 0.6650 z x 0.50
7 0.7500 z y 0.50

最佳答案

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

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 的第一个字母相同。第二个字母始终不是 fld1。因此,这是一种详尽的、可能不是 Pythonic 的方法来计算值并将组合的连接值存储在字典中以供以后使用。

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,它将提取您的fld1fld2并返回cnxn<的计算值 上面。

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

最后,一只小 Pandas 申请把它们全部带回家。

df['connection'] = df.apply(lambda row: check(row['fld1'], row['fld2'],cnxn), axis=1)

这是我的结果,我们的“yz”连接有点关闭,不知道是你的还是我的......

fld1    fld2    relationship    connection
0 x x 0.25 0.5825
1 x y 0.25 0.5000
2 x z 0.50 0.5825
3 y x 0.33 0.4950
4 y y 0.33 0.5775
5 y z 0.33 0.4125
6 z x 0.50 0.6650
7 z y 0.50 0.7500

祝你好运!

关于python - 根据三列的值有条件地交互式计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34799167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com