我有一个DataFrame4列,其中2列包含字符串值.我想知道是否有办法根据与特定列的部分字符串匹配来选择行?
换句话说,函数或lambda函数会做类似的事情
re.search(pattern, cell_in_question)
Run Code Online (Sandbox Code Playgroud)
返回一个布尔值.我熟悉语法,df[df['A'] == "hello world"]但似乎无法找到一种方法来做同样的部分字符串匹配说'hello'.
有人能指出我正确的方向吗?
在大部分操作pandas可以与运营商链接(来完成groupby,aggregate,apply,等),但我发现过滤行的唯一方法是通过正常的托架索引
df_filtered = df[df['column'] == value]
Run Code Online (Sandbox Code Playgroud)
这是没有吸引力的,因为它需要df在能够过滤其值之前分配给变量.有更像以下的东西吗?
df_filtered = df.mask(lambda x: x['column'] == value)
Run Code Online (Sandbox Code Playgroud) 给定一个带有"BoolCol"列的DataFrame,我们想要找到DataFrame的索引,其中"BoolCol"的值== True
我目前有迭代的方式来做到这一点,它完美地工作:
for i in range(100,3000):
if df.iloc[i]['BoolCol']== True:
print i,df.iloc[i]['BoolCol']
Run Code Online (Sandbox Code Playgroud)
但这不是正确的熊猫方式.经过一些研究,我目前正在使用此代码:
df[df['BoolCol'] == True].index.tolist()
Run Code Online (Sandbox Code Playgroud)
这个给了我一个索引列表,但是当我通过执行以下操作检查它们时它们不匹配:
df.iloc[i]['BoolCol']
Run Code Online (Sandbox Code Playgroud)
结果实际上是假的!!
这是正确的熊猫方式吗?
例如,我有简单的DF:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
Run Code Online (Sandbox Code Playgroud)
我可以使用Pandas的方法和习语从"A"中选择"B"的相应值大于50,"C" - 不等于900的值吗?
我有一个场景,用户想要将几个过滤器应用于Pandas DataFrame或Series对象.本质上,我想有效地将一堆过滤(比较操作)链接在一起,这些过滤由用户在运行时指定.
过滤器应该是添加剂(也就是应用的每个应该是狭窄的结果).
我目前正在使用,reindex()但每次创建一个新对象并复制基础数据(如果我正确理解文档).因此,在过滤大型系列或DataFrame时,这可能非常低效.
我认为使用apply(),map()或类似的东西可能会更好.我对Pandas很陌生,尽管如此仍然试图将我的头脑包裹起来.
我想获取以下表单的字典,并将每个操作应用于给定的Series对象并返回"已过滤"的Series对象.
relops = {'>=': [1], '<=': [1]}
Run Code Online (Sandbox Code Playgroud)
我将从一个当前的例子开始,只是过滤一个Series对象.以下是我目前使用的功能:
def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series
Run Code Online (Sandbox Code Playgroud)
用户提供包含他们想要执行的操作的字典:
>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 …Run Code Online (Sandbox Code Playgroud) 我在Pandas中使用布尔索引.问题是为什么声明:
a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)]
Run Code Online (Sandbox Code Playgroud)
工作正常,而
a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)]
Run Code Online (Sandbox Code Playgroud)
存在错误?
例:
a=pd.DataFrame({'x':[1,1],'y':[10,20]})
In: a[(a['x']==1)&(a['y']==10)]
Out: x y
0 1 10
In: a[(a['x']==1) and (a['y']==10)]
Out: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud) 我通过两列中的值过滤数据框中的行.
由于某种原因,OR运算符的行为与我期望AND运算符的行为相反,反之亦然.
我的测试代码:
import pandas as pd
df = pd.DataFrame({'a': range(5), 'b': range(5) })
# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1
df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]
print pd.concat([df, df1, df2], axis=1,
keys = [ 'original df', 'using AND (&)', 'using OR (|)',])
Run Code Online (Sandbox Code Playgroud)
结果如下:
original df using AND (&) using OR (|)
a b a b a …Run Code Online (Sandbox Code Playgroud) 我有点卡在另一个变量上提取一个变量条件的值.例如,以下数据帧:
A B
p1 1
p1 2
p3 3
p2 4
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得A何时的价值B=3?每当我提取值时A,我得到一个对象,而不是一个字符串.
我试图修改一个DataFrame df只包含列中的值closing_price介于99和101之间的行,并尝试使用下面的代码执行此操作.
但是,我得到了错误
ValueError:Series的真值是不明确的.使用a.empty,a.bool(),a.item(),a.any()或a.all()
我想知道是否有办法在不使用循环的情况下执行此操作.
df = df[(99 <= df['closing_price'] <= 101)]
Run Code Online (Sandbox Code Playgroud) 该(x, y)API已经日益普及,多年来,然而,没有关于它的一切是完全理解在结构方面,工作和相关的操作.
一个重要的操作是过滤.过滤是一种常见的要求,但用例是多种多样的.因此,某些方法和功能将比其他用例更适用于某些用例.
总之,本文的目的是触及一些常见的过滤问题和用例,演示解决这些问题的各种不同方法,并讨论它们的适用性.本文试图解决的一些高级问题是
这些问题已分解为6个具体问题,如下所列.为简单起见,以下设置中的示例DataFrame仅具有两个级别,并且没有重复的索引键.提出问题的大多数解决方案可以推广到N级.
本文不会介绍如何创建MultiIndexes,如何对它们执行赋值操作,或任何与性能相关的讨论(这些是另一个时间的单独主题).
问题1-6将在上下文中询问下面的设置.
Run Code Online (Sandbox Code Playgroud)mux = pd.MultiIndex.from_arrays([ list('aaaabbbbbccddddd'), list('tuvwtuvwtuvwtuvw') ], names=['one', 'two']) df = pd.DataFrame({'col': np.arange(len(mux))}, mux) col one two a t 0 u 1 v 2 w 3 b t 4 u 5 v 6 w 7 t 8 c u 9 v 10 d w 11 t 12 u 13 v 14 w 15
问题1:选择单个项目
如何在"1"级中选择"a"的行?
col
one two
a t 0 …Run Code Online (Sandbox Code Playgroud)