【问题标题】:element wise search on pandas column that has list string data对具有列表字符串数据的 pandas 列进行元素明智搜索
【发布时间】:2021-01-14 06:06:00
【问题描述】:

我有一个数据框,其中一列的值如下:

colA colB LISTCOL
USA  100   ['ABCD (Actor)', 'XYZ (Actor, Director)', 'PQR (Producer, Writer)']
UK   1200  ['45q34y(Actor,Director, Producer)', '123 (Actor, Director)']

我想在 LISTCOL 列的每一行中取出列表的元素,以便只过滤包含 Actor 的元素。

我试过了

df['ACTOR'] = df.apply(
        lambda elem: [elem for elem in df['LISTCOL'].str if "Actor" in elem],
    axis=1)

但是它不起作用。 不幸的是,我的熊猫是 0.23.4,因此 df.explode() 在这种情况下不适用于我。 您能否帮助我获得我想要的输出:

输出:

colA colB  ACTOR

USA  100   ['ABCD', 'XYZ']

UK   1200  ['45q34y', '123']

【问题讨论】:

  • 你比当前版本的熊猫落后很多。请升级或安装 Anaconda 发行版。
  • 副本有扩展列表而不爆炸的解决方案。
  • print(type(df.iloc[0, 2])) 的输出是什么。如果结果为str,则必须使用df.LISTCOL = df.LISTCOL.apply(ast.literal_eval)

标签: python pandas


【解决方案1】:

我正在考虑使用 (pd.Series).map()

def make_actors_column(ser):
    temp_list = ''.join(ser).split('(')
    actor_list = []
    for i,string in enumerate(temp_list):
        if 'Actor' in string:
            name_of_actor = temp_list[i-1].split(')')[-1]
            actor_list.append(name_of_actor.strip())
    return actor_list


make_actors_column(df.loc[0,'LISTCOL'])
-->['ABCD', 'XYZ']

df['ACTOR'] = df['LISTCOL'].map(make_actors_column)
df

    colA colB       LISTCOL                                     ACTOR
0   USA 100 [ABCD (Actor), XYZ (Actor, Director), PQR (Pro...   [ABCD, XYZ]
1   UK  120 [45q34y(Actor,Director, Producer), 123 (Actor,...   [45q34y, 123]

我认为这个功能足以应用你的例子

【讨论】:

    【解决方案2】:

    试试这个:

    import re
    
    df['Actors'] = [[re.match('(\w+)\s?\(.*?Actor', x).group(1) for x in i if re.match('(\w+)\s?\(.*?Actor', x)] for i in df['LISTCOL']]
    

    输出:

      colA  colB                                            LISTCOL         Actors
    0  USA   100  [ABCD (Actor), XYZ (Actor, Director), PQR (Pro...    [ABCD, XYZ]
    1   UK  1200  [45q34y(Actor,Director, Producer), 123 (Actor,...  [45q34y, 123
    

    【讨论】:

    • 问题中提到explode不能用
    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2022-11-25
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多