返回包含熊猫数据帧每行中子字符串的第一个值

时间:2017-08-01 16:36:02

标签: python search

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

请为此提供可行的解决方案。

2 个答案:

答案 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