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

我正在尝试在下面的“父”列和“子”列列表中的每个元素上运行几段代码。我的目标结果在“ 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                                     results2

0   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 totalChars


df.agg(lambda x: total_chars(df.parent,df.children), axis=1)


>>> ValueError: operands could not be broadcast together with shapes (10000,) (4,) 

有任何想法吗?


明月笑刀无情
浏览 146回答 2
2回答

慕容森

我相信你需要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                               results20         [(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)]

湖上湖

没有循环数据帧。只是一个用于位置明智比较的功能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 sdf = (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)]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python