如何使用pandas过滤哪些CSV行加载到内存中?这似乎是一个应该找到的选项read_csv.我错过了什么吗?
示例:我们有一个带有时间戳列的CSV,我们只想加载时间戳大于给定常量的行.
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) 我正在 Python Pandas 中使用一个数据框,该数据框的列名以Content.. 我可以通过声明来访问给定的列df['Content.xyz']。但是,当我尝试对其执行查询时,例如df.query("Content.xyz not in @mylist"),它会引发一个Content不是数据帧成员的错误。
如何在名称前加句点执行查询或其他类似操作?
此外,一些系列名称中有空格。我假设带有句点的列名的解决方案类似于包含空格的名称的解决方案。
如果您确切地知道如何过滤数据帧,那么解决方案很简单:
df[(df.A == 1) & (df.B == 1)]
但是,如果您接受用户输入并且事先不知道用户想要使用多少条件,该怎么办?例如,用户想要一个过滤的数据框,其中列[A,B,C] == 1.是否可以执行以下操作:
def filterIt(*args, value):
return df[(df.*args == value)]
Run Code Online (Sandbox Code Playgroud)
所以如果用户调用filterIt(A, B, C, value=1),则返回:
df[(df.A == 1) & (df.B == 1) & (df.C == 1)]
Run Code Online (Sandbox Code Playgroud) 我有这种pandas.DataFrame.得到"x"和"y"时,"a","b"是条件.
df = pd.DataFrame([[10,20,0,.1], [10,20,1,.5], [100,200,0,.33], [100,200,1,.11]], columns=["a", "b", "x", "y"])
df
Run Code Online (Sandbox Code Playgroud)
我需要根据相同的条件绘制(x,y)列的折线图.预期结果图是:
当然,此图像由以下代码手动提供:
pd.DataFrame([[0,.1],[1,.5]]).plot(kind="line", x=0, y=1, style="-", legend=None, title="a: 10, b: 20")
plt.xlabel("x")
plt.ylabel("y")
plt.figure()
pd.DataFrame([[0,.33],[1,.11]]).plot(kind="line", x=0, y=1, style="-", legend=None, title="a: 100, b: 200")
plt.xlabel("x")
plt.ylabel("y")
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在获取包含条件列x和y的数据帧时动态制作上面的图.
列名是固定的.但是,条件列的值是动态更改的.所以,我不能使用值10,20,100,200.
如果我有以下"filter_with_a_and_b"方法,我认为问题解决了:
def filter_with_a_and_b(df, a_b):
# how to implement?
a_b_list = df.drop_duplicates(["a","b"])
new_df_list = filter_with_a_and_b(df, a_b)
for idx, df in enumerate(new_df_list):
df.plot(title=a_b_list[idx])
Run Code Online (Sandbox Code Playgroud) 我有一个数据框df:
id volume saturation time_delay_normalised speed BPR_free_speed BPR_speed Volume time_normalised
27WESTBOUND 580 0.351515152 57 6.54248366 17.88 15.91366177 580 1.59375
27WESTBOUND 588 0.356363636 100 5.107142857 17.88 15.86519847 588 2.041666667
27WESTBOUND 475 0.287878788 64 6.25625 17.88 16.51161331 475 0.666666667
27EASTBOUND 401 0.243030303 59 6.458064516 17.88 16.88283672 401 1.0914583333
27EASTBOUND 438 0.265454545 46 7.049295775 17.88 16.70300418 438 1.479166667
27EASTBOUND 467 0.283030303 58 6.5 17.88 16.55392848 467 0.9604166667
Run Code Online (Sandbox Code Playgroud)
我希望创建一个新的列,free_capacity并将其设置为最大值Volume,每ID当time_normalised大于或等于小于1.1
不考虑time_normalized条件,我可以这样做:
df['free_capacity'] = df.groupby('id')["Volume"].transform('max')
Run Code Online (Sandbox Code Playgroud)
如何添加when time_normalised <= …