list = [['apple', 'orange', 'pear'], ['peach', 'apple', 'pear']]
df = pd.DataFrame(list)
print df
Out[172]:
0 1 2
0 apple orange pear
1 peach apple pear
我正在努力获得子串的第一场比赛' pe'对于df的每一行。基本上我希望输出是一个数据框,给出:
0
0 pear
1 peach
请为此提供可行的解决方案。
答案 0 :(得分:2)
蛮力方法:
In [22]: df
Out[22]:
0 1 2
0 apple orange pear
1 peach apple pear
In [23]: def startswith(prefix, default=''):
...: def f(S):
...: for val in S:
...: if val.startswith(prefix):
...: return val
...: return default
...: return f
...:
In [24]: df.apply(startswith('pe'), axis=1)
Out[24]:
0 pear
1 peach
dtype: object
注意,这不会有效。它本质上是一个庞大的,嵌套的,python-for-loop。也许如果你有一堆字符串,DataFrame就不是正确的数据结构。
注意,df.apply
采用函数将应用于每个列(如果传递axis = 0,默认值)或每行(如果传递axis = 1) )。
startswith
函数是函数工厂,因此您可以向其传递要搜索的前缀,以及如果从未找到匹配项将返回的默认值(它可以设置为你想要的任何东西),它返回一个新函数,它搜索给定这些约束的行。
答案 1 :(得分:0)
我和@ juanpa.arrivillaga的解决方案差不多。只要你期望多维列表输入相对较小,那么这个嵌套循环应该可以正常工作。
循环遍历多维数组(在它放入DataFrame之前),然后搜索该列表以查找以' pe'开头的字符串的第一个匹配项。 (或者你正在寻找的任何东西)。将该字符串作为单项列表插入到结果列表中。填充该列表后,再次将其放入DataFrame中。
myList = [[' apple',' orange',' pear'],['桃子',' apple& #39;,'梨']] resultList = []
for row in myList:
for fruit in row:
if fruit.startswith('pe'):
resultList.append([fruit])
break
df2 = pd.DataFrame(resultList)
printdf