(2/19/2019):我在 numexpr 跟踪器中打开了一个报告:https : //github.com/pydata/numexpr/issues/331
熊猫报告是:https : //github.com/pandas-dev/pandas/issues/25369
除非我正在做一些我不应该做的事情,否则可空 int 的新 dtype 扩展似乎在数据帧上的 QUERY 方法中存在错误(问题似乎出在 numexpr 包中):
df_test = pd.DataFrame(data=[4,5,6], columns=["col_test"])
df_test = df_test.astype(dtype={"col_test": pd.Int32Dtype()})
df_test.query("col_test != 6")
Run Code Online (Sandbox Code Playgroud)
长错误消息的最后几行是:
文件“...\site_packages\numexpr\necompiler.py”,第 822 行,在评估 zip(names,arguments)] 文件“...\site_packages\numexpr\necompiler.py”,第 821 行,签名 = [( name, getType(arg)) for (name, arg) in File "...\site_packages\numexpr\necompiler.py", line 703, in getType raise ValueError("unknown type %s" % a.dtype.name)值错误:未知类型对象
非扩展 dtypes 工作正常:
df_test = df_test.astype(dtype={"col_test": np.int32})
df_test.query("col_test != 6")
Run Code Online (Sandbox Code Playgroud)
(ps 作为一个完全独立的问题,将 dtype 直接传递给 pd.DataFrame 构造函数是行不通的——似乎有问题)。
谢谢。
假设我有以下数据框:
df = pd.DataFrame({'color':['red', 'green', 'blue'], 'brand':['Ford','fiat', 'opel'], 'year':[2016,2016,2017]})
brand color year
0 Ford red 2016
1 fiat green 2016
2 opel blue 2017
Run Code Online (Sandbox Code Playgroud)
我知道要选择使用多列,我可以执行以下操作:
new_df = df[(df['color']=='red')&(df['year']==2016)]
Run Code Online (Sandbox Code Playgroud)
现在我想做的是找到一种方法使用字典来选择我想要的行,其中字典的键表示映射到允许值的列。例如,在 df 上应用以下字典{'color':'red', 'year':2016}将产生与 new_df 相同的结果。
我已经可以用 for 循环来做到这一点,但我想知道是否有更快和/或更“ Pythonic ”的方法来做到这一点!
请包括该方法所花费的时间。
我想根据查询设置列的值.我可能会用它.where来完成这个,但是标准.query是字符串,我更容易维护,特别是当标准变得复杂时.
import numpy as np
import pandas as pd
np.random.seed(51723)
df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))
Run Code Online (Sandbox Code Playgroud)
我想创建一个新列d,并将值设置为1,满足这些条件:
criteria = '(a < b) & (b < c)'
Run Code Online (Sandbox Code Playgroud)
除其他外,我试过:
df['d'] = np.nan
df.query(criteria).loc[:,'d'] = 1
Run Code Online (Sandbox Code Playgroud)
但是,除非SettingWithCopyWarning尽管我正在使用,否则这似乎什么都不做.loc
inplace像这样传递:
df.query(criteria, inplace=True).loc[:,'d'] = 1
Run Code Online (Sandbox Code Playgroud)
给 AttributeError: 'NoneType' object has no attribute 'loc'
我想使用 Pandas 中的 .query() 方法创建 isna() 子句
但我收到错误。
对于可重现的示例:
import pandas as pd
import seaborn as sns
mpg = sns.load_dataset('mpg')
mpg[mpg['cylinders'].isna()] # This works
mpg.query('cylinders.isna()') # This raises an exception
TypeError: 'Series' objects are mutable, thus they cannot be hashed
Run Code Online (Sandbox Code Playgroud) 正如我的问题所述,我想在运行时调用数据帧的自定义函数。自定义函数的用途是计算两个日期之间的差异(即年龄)、将年份转换为月份、从两列中查找最大最小值等。
到目前为止,我成功地执行了算术运算和一些函数,如abs()、sqrt(),但无法让min()-max()工作。工作是,
df.eval('TT = sqrt(Q1)',inplace=True)
df.eval('TT1 = abs(Q1-Q2)',inplace=True)
df.eval('TT2 = (Q1+Q2)*Q3',inplace=True)
Run Code Online (Sandbox Code Playgroud)
以下代码适用于 eval。如何将其与 dataframe eval 一起使用?
def find_max(x,y):
return np.maximum(x,y)
eval('max1')(4,7)
def find_age(date_col1,date_col2):
return 'I know how to calc age but how to call func this with df.eval and assign to new col'
Run Code Online (Sandbox Code Playgroud)
示例数据框:
op_d = {'ID': [1, 2,3],'V':['F','G','H'],'AAA':[0,1,1],'D':['2019/12/04','2019/02/01','2019/01/01'],'DD':['2019-12-01','2016-05-31','2015-02-15'],'CurrentRate':[7.5,2,2],'NoteRate':[2,3,3],'BBB':[0,4,4],'Q1':[2,8,10],'Q2':[3,5,7],'Q3':[5,6,8]}
df = pd.DataFrame(data=op_d)
Run Code Online (Sandbox Code Playgroud)
任何帮助或链接到文档表示赞赏。
我找到但没有解决我的问题的有用链接是:
使用 pd.eval() 在 pandas 中进行动态表达式评估
我正在努力加快几个大型多级数据帧的总和.
这是一个示例:
df1 = mul_df(5000,30,400) # mul_df to create a big multilevel dataframe
#let df2, df3, df4 = df1, df1, df1 to minimize the memory usage,
#they can also be mul_df(5000,30,400)
df2, df3, df4 = df1, df1, df1
In [12]: timeit df1+df2+df3+df4
1 loops, best of 3: 993 ms per loop
Run Code Online (Sandbox Code Playgroud)
我不满足于993ms,有没有办法加速?cython可以改善性能吗?如果是的话,如何编写cython代码?谢谢.
注意:
mul_df()是创建演示多级数据帧的功能.
import itertools
import numpy as np
import pandas as pd
def mul_df(level1_rownum, level2_rownum, col_num, data_ty='float32'):
''' create multilevel dataframe, for example: mul_df(4,2,6)'''
index_name = …Run Code Online (Sandbox Code Playgroud) 我是熊猫的新手所以请原谅新手问题!
我有以下代码;
import pandas as pd
pet_names = ["Name","Species"
"Jack","Cat"
"Jill","Dog"
"Tom","Cat"
"Harry","Dog"
"Hannah","Dog"]
df = pd.DataFrame(pet_names)
df = df[df['Species']!='Cat']
print(df)
Run Code Online (Sandbox Code Playgroud)
我想删除所有包含"猫"中的"物种"列中的行,让所有的狗后面.我该怎么做呢?不幸的是,此代码目前返回错误.
pandas ×7
python ×5
dataframe ×2
python-3.x ×2
cython ×1
eval ×1
filter ×1
performance ×1
select ×1