为了账号安全,请及时绑定邮箱和手机立即绑定

根据现有列的条件创建新的 pandas 列

根据现有列的条件创建新的 pandas 列

互换的青春 2023-12-26 15:47:10
我有一个数据框,如下所示:col1 = ['a','b','c','a','c','a','b','c','a']col2 = [1,1,0,1,1,0,1,1,0]df2 = pd.DataFrame(zip(col1,col2),columns=['name','count'])    name    count0   a       11   b       12   c       03   a       14   c       15   a       06   b       17   c       18   a       0我试图找到“名称”列中每个元素对应的零数与零+一总和的比率。首先我将计数汇总如下:for j in df2.name.unique():    print(j)    zero_ct = zero_one_frequencies[zero_one_frequencies['name'] == j][0]    full_ct = zero_one_frequencies[zero_one_frequencies['name'] == j][0] + zero_one_frequencies[zero_one_frequencies['name'] == j][1]    zero_pb = zero_ct / full_ct    one_pb = 1 - zero_pb    print(f"ZERO rations for {j} = {zero_pb}")    print(f"One ratios for {j} = {one_pb}")    print("="*30)输出如下:aZERO ratios for a = 0    0.5dtype: float64One ratios for a = 0    0.5dtype: float64==============================bZERO ratios for b = 1    0.0dtype: float64One ratios for b = 1    1.0dtype: float64==============================cZERO ratios for c = 2    0.333333dtype: float64One ratios for c = 2    0.666667dtype: float64==============================我的目标是向数据框中添加 2 个新列:“name_0”和“name_1”,以及“name”列中每个元素的比率值。我尝试了一些方法,但没有给出预期的结果:for j in df2.name.unique():    print(j)    zero_ct = zero_one_frequencies[zero_one_frequencies['name'] == j][0]    full_ct = zero_one_frequencies[zero_one_frequencies['name'] == j][0] + zero_one_frequencies[zero_one_frequencies['name'] == j][1]    zero_pb = zero_ct / full_ct    one_pb = 1 - zero_pb    print(f"ZERO Probablitliy for {j} = {zero_pb}")    print(f"One Probablitliy for {j} = {one_pb}")    print("="*30)        condition1 = [ df2['name'].eq(j) & df2['count'].eq(0)]    condition2 = [ df2['name'].eq(j) & df2['count'].eq(1)]    choice1 = zero_pb.tolist()    choice2 = one_pb.tolist()该列将使用名称元素“c”的值进行更新。这是可以预料的,因为最后计算的值将用于更新所有值。还有另一种方法可以有效地使用 np.select 吗?
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

我无法访问 Zero_one_frequencies df。所以我冒昧地尝试用我的方式解决这个问题。


import pandas as pd

import numpy as np

col1 = ['a','b','c','a','c','a','b','c','a']

col2 = [1,1,0,1,1,0,1,1,0]

df2 = pd.DataFrame(zip(col1,col2),columns=['name','count'])


df2["name_0"] = 0

df2["name_1"] = 0


for name in df2['name'].unique():

  df_name = df2[df2['name'] == name]

  prob_1 = sum(df_name['count']/df_name.shape[0])

  for count in df2['count'].unique():

    indx = np.where((df2['name'] == name) & (df2['count'] == count))

    df2["name_" + str(count)].loc[indx] = np.abs(((count +1) % 2) - prob_1)

输出:


name    count   name_0  name_1

0   a   1   0.000000    0.500000

1   b   1   0.000000    1.000000

2   c   0   0.333333    0.000000

3   a   1   0.000000    0.500000

4   c   1   0.000000    0.666667

5   a   0   0.500000    0.000000

6   b   1   0.000000    1.000000

7   c   1   0.000000    0.666667

8   a   0   0.500000    0.000000

查看完整回答
反对 回复 2023-12-26
?
慕容3067478

TA贡献1773条经验 获得超3个赞

以下代码解决了该问题。但是,我找不到使用 numpy.select 获得相同效果的方法。


df2["name"+str("_0")] = 0.0

df2["name"+str("_1")] = 0.0

for j in df2.name.unique():

    print(j)

    zero_ct = zero_one_frequencies[zero_one_frequencies['name'] == j][0]

    full_ct = zero_one_frequencies[zero_one_frequencies['name'] == j][0] + zero_one_frequencies[zero_one_frequencies['name'] == j][1]

    zero_pb = zero_ct / full_ct

    one_pb = 1 - zero_pb

    print(f"ZERO Probablitliy for {j} = {zero_pb.tolist()[0]}")

    print(f"One Probablitliy for {j} = {one_pb.tolist()[0]}")

    print("="*30)

    for idx in df2[df2['name']== j ].index:

        print("Index:::", idx)

        if df2['count'].iloc[idx] == 0:

            df2.at[idx, "name"+str("_0")] = zero_pb.tolist()[0]

            print(f'Count for {j} at index {idx} is {a}')

            print('printing name_0: ', df2["name"+str("_0")].iloc[idx])

            print("*"*30)

        elif df2['count'].iloc[idx] == 1:

            df2.at[idx, "name"+str("_1")] = one_pb.tolist()[0]

            print(f'Count for {j} at index {idx} is {b}')

            print('printing name_1: ', df2["name"+str("_1")].iloc[idx])

            print("*"*30)


查看完整回答
反对 回复 2023-12-26
  • 2 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信