Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回在panda数据帧的每行中包含子字符串的第一个值_Python_Search - Fatal编程技术网

Python 返回在panda数据帧的每行中包含子字符串的第一个值

Python 返回在panda数据帧的每行中包含子字符串的第一个值,python,search,Python,Search,我试图为df的每一行获取子字符串“pe”的第一个匹配项。基本上,我希望输出是一个数据帧,它提供: 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 请为此提供可行的解决方案。暴力方法:

我试图为df的每一行获取子字符串“pe”的第一个匹配项。基本上,我希望输出是一个数据帧,它提供:

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
请为此提供可行的解决方案。

暴力方法:

       0
0  pear
1  peach
注意,这将不会是有效的。它本质上是一个庞大的嵌套python for循环。如果您有一堆字符串,那么数据帧可能不是正确的数据结构

注意,
df.apply
采用一个函数,该函数将应用于每一列(如果传递轴=0,则为默认值)或每一行(如果传递轴=1)

startswith
函数是一个函数工厂,因此您可以向它传递一个要搜索的前缀和一个默认值,如果它从未找到匹配项(您可以将其设置为任何您想要的值),它将返回一个新函数,在给定这些约束的情况下搜索行。

蛮力方法:

       0
0  pear
1  peach
注意,这将不会是有效的。它本质上是一个庞大的嵌套python for循环。如果您有一堆字符串,那么数据帧可能不是正确的数据结构

注意,
df.apply
采用一个函数,该函数将应用于每一列(如果传递轴=0,则为默认值)或每一行(如果传递轴=1)


startswith
函数是一个函数工厂,因此您可以向它传递一个要搜索的前缀,以及一个默认值,如果它从未找到匹配项,则将返回该值(您可以将其设置为任意值),它返回一个新函数,该函数搜索给定这些约束的行。

我的解决方案与@juanpa.arrivillaga几乎相同。只要您希望多维列表输入相对较小,那么这个嵌套循环就可以正常工作

循环遍历多维数组(在将其放入数据帧之前),然后搜索该列表以查找以“pe”(或您正在搜索的任何内容)开头的字符串的第一个匹配项。将该字符串作为一项列表插入结果列表。填充该列表后,再次将其放入数据帧中

myList=[[apple]、[orange]、[pear]、[peach]、[apple]、[pear]] 结果列表=[]

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

我的解决方案与@juanpa.arrivillaga几乎相同。只要您希望多维列表输入相对较小,那么这个嵌套循环就可以正常工作

循环遍历多维数组(在将其放入数据帧之前),然后搜索该列表以查找以“pe”(或您正在搜索的任何内容)开头的字符串的第一个匹配项。将该字符串作为一项列表插入结果列表。填充该列表后,再次将其放入数据帧中

myList=[[apple]、[orange]、[pear]、[peach]、[apple]、[pear]] 结果列表=[]

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

请不要执行
list=[…]
,因为现在您正在跟踪内置的
list
类型构造函数。这可能会导致很难检测到的错误,这是一个坏主意。明白了。感谢您的提示,请不要执行
list=[…]
,因为现在您正在跟踪内置的
list
类型构造函数。这可能会导致很难检测到的错误,这是一个坏主意。明白了。感谢tipI尝试df.apply(lambda x:x如果x.contains('pe')else np.nan,axis=1),这似乎不起作用。我在这里做错了什么?@Swarnar,因为传递给
apply
get的函数传递了一个
pd.Series
,它是一行或一列(取决于轴参数)。注意,我使用参数
S
来记住这一点<代码>pd.系列没有
。包含
method@Swarnar此外,我认为我误解了您查找以
“pe”
开头的字符串的意图,但是您可以轻松地修改上述内容以查找包含
“pe”
但在val:中使用
if prefix而不是
if val.startswith(prefix)的字符串
我尝试了df.apply(lambda x:x如果x.contains('pe')或者np.nan,axis=1),这似乎不起作用。我在这里做错了什么?@Swarnar,因为传递给
apply
get的函数传递了一个
pd.Series
,它是一行或一列(取决于轴参数)。注意,我使用参数
S
来记住这一点<代码>pd.系列
没有
。包含
method@Swarnar此外,我认为我误解了您查找以
“pe”
开头的字符串的意图,但是您可以轻松地修改上述内容以查找包含
“pe”
但在val:中使用
if prefix而不是
if val.startswith(prefix)的字符串