从列表中选择一个条目,如果其中的键包含来自另一列的字符串
问题描述:
我有一个关于我的数据框的问题。具体来说,在一列中,对于每一行,我都有一个发言者和演讲的列表。现在,我想根据演讲者是否是我正在寻找的演讲者来选择恰当的一个演讲,这在另一列中提到。所以一列提供了我正在寻找的姓氏,另一列提供了所有发言者(姓和名)及其讲话的列表,并且我想创建一个新的列,其中该讲话存储在相应的行中。从列表中选择一个条目,如果其中的键包含来自另一列的字符串
所以我最初的数据集是这样的:
ticker year quarter exel_lname jobposition speech
xx 2009 1 Angle CEO [("Mike Angle", "Thank you"), ("Barbara Barth", "It is")]
xx 2009 1 Barth CFO [("Mike Angle", "Thank you"), ("Barbara Barth", "It is")]
xx 2009 2 Angle CEO [("Mike Angle", "I am surprised"), ("Barbara Barth", "So am I")]
xx 2009 2 Barth CFO [("Mike Angle", "I am surprised"), ("Barbara Barth", "So am I")]
yy 2008 3 Cruz CEO [("Damien Cruz", "Hello"), ("Lara Dolm", "Nice to meet you")]
yy 2008 3 Dolm CFO [("Damien Cruz", "Hello"), ("Lara Dolm", "Nice to meet you")]
一行例如,我要检查每一个键值对的第一个列表条目是否包含姓氏,如果没有继续下去,如果是,将语音部分(即第二个列表条目)存储在新列中。因此,我想要下面的数据集(我在这里隐藏了最初的专栏演讲,但它仍然应该被包含,所以我不想替换它,只是创建一个新的专栏)。
ticker year quarter exel_lname jobposition speechmanager
xx 2009 1 Angle CEO "Thank you"
xx 2009 1 Barth CFO "It is"
xx 2009 2 Angle CEO "I am surprised"
xx 2009 2 Barth CFO "So am I"
yy 2008 3 Cruz CEO "Hello"
yy 2008 3 Dolm CFO "Nice to meet you"
有人能帮助我如何在Python 3解决呢?
谢谢! 朱莉娅
答
这也许是最好的书面方式的功能,然后将它按行来完成:
def get_speech(row):
matches = list(filter(lambda x: x[0].endswith(row['exel_lname']), row['speech']))
if len(matches) > 0:
return matches[0][1]
return ''
df['speechmanager'] = df.apply(get_speech, axis=1)
谢谢!我以某种方式得到:“('列表索引超出范围','发生在索引0')”回来。可能可能是这样的:def f(L): res1 = defaultdict(list) for df [“exec_lname”]: for v,k in L: 1st approach:new = [k for k in L if item in v] 第二种方法:如果有的话(v中v的项为L) df [“ speechmanager“] = df [”speech“]。apply(f) 或类似的工作?或者为什么列表索引可能超出范围? – Julia
@Julia如果列表理解返回一个空列表,那么我最初并没有考虑到这个'[0]'索引会超出范围;我修改了答案,以便理解返回匹配的第一个元组的第二项(如果匹配),或者如果不匹配,则返回空字符串。 – cmaher
谢谢 - 它现在适用于某些观察 - 仅适用于第一个元组也是项[0]以姓氏结尾的元素。如果该人不是第一位发言者,并且他的发言出现在另一个元组中,则返回空字符串。有没有办法让Python继续搜索所有元组? – Julia