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