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

在带有字符串和列表列的熊猫列上运行一个函数

在带有字符串和列表列的熊猫列上运行一个函数

明月笑刀无情 2023-06-20 14:00:25
我正在尝试在下面的“父”列和“子”列列表中的每个元素上运行几段代码。我的目标结果在“ resultsX ”列中:第一个代码(显示在 results1 列中)片段只需要两个字符串并获取每个字符串中的唯一字符总数:>>> len(set('max' + 'andi'))>>> 6第二段代码(显示在 results2 列中)计算两个字符串中相同位置的字符数:>>> sum(1 if c1 == c2 else 0 for c1, c2 in zip('maxwell', ' axwell'))>>> 6我想在“parent”列和“children”列中的每个元素上运行这两段代码,分别获取“ results1 和 results2”列中的内容:parent           children                       results1                                     results20   MAX          ['MAX', 'amx', 'akd']          [('MAX',3),('amx',3),('akd',5)]          [('MAX',3),('amx',0),('akd',0)]1   Sam          ['Sam','sammy','samsam']       [('Sam',3),('sammy',4), ('samsam',3)]      [('Sam',3),('sammy',3), ('samsam',3)]2   Larry        ['lar','lair','larrylamo']     [('lar',4),('lair',5), ('larrylamo',6)]  [('lar',3),('lair',3), ('larrylamo',5)]我在下面尝试过这段代码,但运行时出现错误:def total_chars(reference, value_list):    chars = []    for val in value_list:        totalChars = len(set(reference + val))        chars.append(val, reference)            return totalCharsdf.agg(lambda x: total_chars(df.parent,df.children), axis=1)>>> ValueError: operands could not be broadcast together with shapes (10000,) (4,) 有任何想法吗?
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

我相信你需要


def cust_func(row):

    results1 = []

    results2 = []

    p = row['parent'].lower()

    for i in row['children']:

        t = i.lower()

        results1.append((i, len(set(t + p))))

        results2.append((i, sum(int(k==v) for k,v in zip(t, p))))


    return pd.Series([results1, results2])

        


df = pd.DataFrame({"parent": ['Max', 'Sam', 'Larry'], "children": [['MAX', 'amx', 'akd'], ['Sam','sammy','samsam'], ['lar','lair','larrylamo']]})

df[['results1', 'results2']]  = df.apply(cust_func, axis=1)

print(df[['results1', 'results2']])

输出:


                                results1                               results2

0         [(MAX, 3), (amx, 3), (akd, 5)]         [(MAX, 3), (amx, 1), (akd, 0)]

1    [(Sam, 3), (sammy, 4), (samsam, 3)]    [(Sam, 3), (sammy, 3), (samsam, 3)]

2  [(lar, 4), (lair, 5), (larrylamo, 6)]  [(lar, 3), (lair, 3), (larrylamo, 5)]


查看完整回答
反对 回复 2023-06-20
?
湖上湖

TA贡献2003条经验 获得超2个赞

没有循环数据帧。只是一个用于位置明智比较的功能


df = pd.DataFrame([{'parent': 'MAX', 'children': ['MAX', 'amx', 'akd']},

 {'parent': 'Sam', 'children': ['Sam', 'sammy', 'samsam']},

 {'parent': 'Larry', 'children': ['lar', 'lair', 'larrylamo']}])


def placewise(a1, a2):

    s = 0

    for i in range(min(len(a1), len(a2))):

        if a1[i] == a2[i]: s += 1

    return s


df = (df.explode("children")

 .assign(

     results1=lambda x: x.apply(lambda r: (r["children"], 

                                           len(np.unique(np.concatenate([list(r["parent"].upper()), 

                                                                         list(r["children"].upper())])))

                                          ), axis=1),

     results2=lambda x: x.apply(lambda r: (r["children"], placewise(r["parent"].upper(), 

                                                                    r["children"].upper()

                                                                   )

                                          ), axis=1),

 )

 .groupby("parent", as_index=False).agg({"children":lambda x: list(x),

                                         "results1":lambda x: list(x),

                                         "results2":lambda x: list(x)})

 

)


print(df.to_string(index=False))

输出


parent                children                               results1                               results2

 Larry  [lar, lair, larrylamo]  [(lar, 4), (lair, 5), (larrylamo, 6)]  [(lar, 3), (lair, 3), (larrylamo, 5)]

   MAX         [MAX, amx, akd]         [(MAX, 3), (amx, 3), (akd, 5)]         [(MAX, 3), (amx, 1), (akd, 0)]

   Sam    [Sam, sammy, samsam]    [(Sam, 3), (sammy, 4), (samsam, 3)]    [(Sam, 3), (sammy, 3), (samsam, 3)]



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

添加回答

举报

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