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

比较 Pandas 中的列表元素和子列表元素

比较 Pandas 中的列表元素和子列表元素

RISEBY 2023-07-27 17:54:28
dfcol1                       col2['aa', 'bb', 'cc', 'dd']   [['ee', 'ff', 'gg', 'hh'], ['qq', 'ww', 'ee', 'rr']]['ss', 'dd', 'ff', 'gg']   [['mm', 'nn', 'vv', 'cc'], ['zz', 'aa', 'jj', 'kk']]['ss', 'dd']               [['mm', 'nn', 'vv', 'cc'], ['zz', 'aa', 'jj', 'kk']]我希望能够运行一个函数,将第一个列表元素连接到 中的第一个子列表元素col1(有多个子列表)col2,然后将第二个列表元素连接到 中col1的第二个子列表元素col2。结果将类似于此列:results[['aaee', 'bbff', 'ccgg', 'ddhh'],['aaqq', 'bbww', 'ccee', 'ddrr']][['ssmm', 'ddnn', 'ffvv', 'ggcc'],['sszz', 'ddaa', 'ffjj', 'ggkk']][['ssmm', 'ddnn'],['sszz', 'ddaa']]我认为这与循环遍历第一个元素有关,col1并以某种方式循环并将它们与每个子列表中的相应项目相匹配col2- 我该怎么做?转换后的代码[[[df1.agg(lambda x: get_top_matches(u,w), axis=1) for u,w in zip(x,v)]\for v in y] for x,y in zip(df1['parent_org_name_list'], df1['children_org_name_sublists'])]结果:
查看完整描述

3 回答

?
慕丝7291255

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

你可以zip在这里使用:


[[[u+w for u,w in zip(x,v)] for v in y] for x,y in zip(df['col1'], df['col2'])]

输出:


[[['aaee', 'bbff', 'ccgg', 'ddhh'], ['aaqq', 'bbww', 'ccee', 'ddrr']],

 [['ssmm', 'ddnn', 'ffvv', 'ggcc'], ['sszz', 'ddaa', 'ffjj', 'ggkk']],

 [['ssmm', 'ddnn'], ['sszz', 'ddaa']]]

要分配回您的数据框,您可以执行以下操作:


df['results'] = [[[u+w for u,w in zip(x,v)] for v in y] 

            for x,y in zip(df['col1'], df['col2'])]


查看完整回答
反对 回复 2023-07-27
?
holdtom

TA贡献1805条经验 获得超10个赞

Max,循环尝试这个解决方案。它允许对转换进行更精细的控制,包括处理不均匀的长度(参见len_limit示例):


import pandas as pd

df = pd.DataFrame({'c1':[['aa', 'bb', 'cc', 'dd'],['ss', 'dd', 'ff', 'gg']],

                   'c2':[[['ee', 'ff', 'gg', 'hh'], ['qq', 'ww', 'ee', 'rr']],

                         [['mm', 'nn', 'vv', 'cc'], ['zz', 'aa', 'jj', 'kk']]],})  


df ['c3'] = 'empty'  # send string to 'c3' so it is object data type

print(df)

                 c1                                    c2     c3

0  [aa, bb, cc, dd]  [[ee, ff, gg, hh], [qq, ww, ee, rr]]  empty

1  [ss, dd, ff, gg]  [[mm, nn, vv, cc], [zz, aa, jj, kk]]  empty


for i, row  in df.iterrows():

    c3_list = []

    len_limit = len (row['c1']

    for c2_sublist in row['c2']:

        c3_list.append([j1+j2 for j1, j2 in zip(row['c1'], c2_sublist[:len_limit])])

    df.at[i, 'c3'] = c3_list

    

print (df['c3'])


0    [[aaee, bbff, ccgg, ddhh], [aaqq, bbww, ccee, ...

1    [[ssmm, ddnn, ffvv, ggcc], [sszz, ddaa, ffjj, ...

Name: c3, dtype: object


查看完整回答
反对 回复 2023-07-27
?
ITMISS

TA贡献1871条经验 获得超8个赞

尝试:


df["results"] = df[["col1", "col2"]].apply(lambda x: [list(map(''.join, zip(x["col1"], el))) for el in x["col2"]], axis=1)

输出:


>>> df["results"]


0    [[aaee, bbff, ccgg, ddhh], [aaqq, bbww, ccee, ...

1    [[ssmm, ddnn, ffvv, ggcc], [sszz, ddaa, ffjj, ...

2                         [[ssmm, ddnn], [sszz, ddaa]]


查看完整回答
反对 回复 2023-07-27
  • 3 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

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