我有一个场景,用户想要将几个过滤器应用于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) pd.eval并且eval是pandas API套件中功能强大但被低估的功能,它们的使用远未完全记录或理解.小心适量,eval并且engine可以极大地简化代码,提高性能,并成为创建动态工作流的强大工具.
这个规范QnA的目的是让用户更好地理解这些功能,讨论一些鲜为人知的功能,如何使用它们,以及如何最好地使用它们,以及清晰易懂的示例.这篇文章将讨论的两个主要议题是
parser,df2并x在争论pd.eval,以及它们如何被用来计算表达式eval,eval并且engine,当每个功能是合适的用于动态执行.这篇文章不能替代文档(答案中的链接),所以请完成它!
我将以这样的方式构建一个问题,以便开启对所支持的各种功能的讨论parser.
给出两个DataFrame
np.random.seed(0)
df1 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.choice(10, (5, 4)), columns=list('ABCD'))
df1
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
3 8 8 1 6
4 7 7 8 1
df2
A B C …Run Code Online (Sandbox Code Playgroud) 我正在看这个和这个线程,虽然我的问题没有那么不同,但它有一些差异.我有一个数据帧floats,我想用字符串替换.说:
A B C
A 0 1.5 13
B 0.5 100.2 7.3
C 1.3 34 0.01
Run Code Online (Sandbox Code Playgroud)
对于这个表我想用几个标准替换,但只有第一个替换工作:
df[df<1]='N' # Works
df[(df>1)&(df<10)]#='L' # Doesn't work
df[(df>10)&(df<50)]='M' # Doesn't work
df[df>50]='H' # Doesn't work
Run Code Online (Sandbox Code Playgroud)
如果我改为基于第二行的选择float,仍然不起作用:
((df.applymap(type)==float) & (df<10) & (df>1)) #Doesn't work
Run Code Online (Sandbox Code Playgroud)
我想知道如何申请pd.DataFrame().mask这里,或任何其他方式.我该怎么解决这个问题?
或者,我知道我可以逐列阅读并在每个系列中应用替换,但这似乎有点适得其反
编辑:任何人都可以解释为什么上面的4个简单分配不起作用?
我知道如何在查询单个列时创建一个掩码来过滤数据帧:
import pandas as pd
import datetime
index = pd.date_range('2013-1-1',periods=100,freq='30Min')
data = pd.DataFrame(data=list(range(100)), columns=['value'], index=index)
data['value2'] = 'A'
data['value2'].loc[0:10] = 'B'
data
value value2
2013-01-01 00:00:00 0 B
2013-01-01 00:30:00 1 B
2013-01-01 01:00:00 2 B
2013-01-01 01:30:00 3 B
2013-01-01 02:00:00 4 B
2013-01-01 02:30:00 5 B
2013-01-01 03:00:00 6 B
Run Code Online (Sandbox Code Playgroud)
我在这里使用一个简单的面具:
mask = data['value'] > 4
data[mask]
value value2
2013-01-01 02:30:00 5 B
2013-01-01 03:00:00 6 B
2013-01-01 03:30:00 7 B
2013-01-01 04:00:00 8 B
2013-01-01 04:30:00 9 …Run Code Online (Sandbox Code Playgroud) 简单实用的问题,但我找不到解决方案.
我看过的问题如下:
使用pandas将列从一个DataFrame复制到另一个DataFrame的最快方法?
这些与我之间的关键区别在于我不需要插入单个值,而是插入一行.
我的问题是,我拿起一行数据帧,比方说df1.因此我有一个系列.
现在我有了这个其他数据框,df2我根据标准选择了多行,我想将该系列复制到所有那些行.
DF1:
Index/Col A B C
1 0 0 0
2 0 0 0
3 1 2 3
4 0 0 0
Run Code Online (Sandbox Code Playgroud)
DF2:
Index/Col A B C
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
Run Code Online (Sandbox Code Playgroud)
我想要完成的是将df1 [3]插入到行df2 [2]和df3 [3]中.所以像非工作代码:
series = df1[3]
df2[df2.index>=2 and df2.index<=3] = series
Run Code Online (Sandbox Code Playgroud)
回国
DF2:
Index/Col A B C
1 0 0 0
2 1 …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,我想删除 A 列等于蓝色且列 B 等于绿色的所有行。
我虽然下面应该工作,但事实并非如此。
任何人都可以看到问题
df=df.loc[~(df['A']=='blue' & df['B']=='green')]
Run Code Online (Sandbox Code Playgroud) 这是我正在使用的表
我需要使用 'Duration'>70 和 'End Terminal'==10 访问数据点因此我尝试过
kj[kj['Duration']>70]
kj[kj['End Terminal'] == 10]
Run Code Online (Sandbox Code Playgroud)
上面的命令单独工作正常,但是当我将它们作为:
kj[kj['End Terminal'] == 10] & kj[kj['Duration']>70]
Run Code Online (Sandbox Code Playgroud)
有一个错误,因此如何在 Pandas-Python 的一个语句中使用这两个条件