对于大型数据帧(大约1~3百万行),应用函数似乎工作得非常慢.
我在这里检查了相关的问题,比如加速熊猫应用功能,以及在pandas apply()函数中计数,似乎加速它的最好方法是不使用apply函数:)
对于我的情况,我有两种与apply函数有关的任务.
第一:应用查找字典查询
f(p_id, p_dict):
return p_dict[p_dict['ID'] == p_id]['value']
p_dict = DataFrame(...) # it's another dict works like lookup table
df = df.apply(f, args=(p_dict,))
Run Code Online (Sandbox Code Playgroud)
第二:适用于groupby
f(week_id, min_week_num, p_dict):
return p_dict[(week_id - min_week_num < p_dict['WEEK']) & (p_dict['WEEK'] < week_id)].ix[:,2].mean()
f_partial = partial(f, min_week_num=min_week_num, p_dict=p_dict)
df = map(f, df['WEEK'])
Run Code Online (Sandbox Code Playgroud)
我想对于第一种情况,它可以通过数据帧连接完成,而我不确定这种连接在大型数据集上的资源成本.
我的问题是:
apply在大多数情况下,似乎可以加速数据帧的操作过程.但是当我使用时,apply我没有找到加速.这是我的例子,我有一个包含两列的数据框
>>>df
index col1 col2
1 10 20
2 20 30
3 30 40
Run Code Online (Sandbox Code Playgroud)
我想要做的就是通过实施函数来计算值,每一行数据帧R(x)上col1,结果将由值划分col2.例如,第一行的结果应该是R(10)/20.所以这是我的函数,它将被调用apply
def _f(input):
return R(input['col1'])/input['col2']
Run Code Online (Sandbox Code Playgroud)
然后我打电话_f的apply:df.apply(_f, axis=1)
但我发现在这种情况下,apply比循环要慢得多
for i in list(df.index)
new_df.loc[i] = R(df.loc[i,'col1'])/df.loc[i,'col2']
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释原因吗?
我有一个包含三列的数据框:nums有一些要使用的值,b它始终是1or0和result当前除第一行之外的任何地方都为零的列(因为我们必须有一个初始值才能使用)。数据框如下所示:
nums b result
0 20.0 1 20.0
1 22.0 0 0
2 30.0 1 0
3 29.1 1 0
4 20.0 0 0
...
Run Code Online (Sandbox Code Playgroud)
我想从第二行开始查看数据框中的每一行,进行一些计算并将结果存储在result列中。由于我正在处理大文件,因此我需要一种方法来快速执行此操作,这就是为什么我想要类似apply.
我想要做的计算是采取值nums和result从以前的行,如果在当前行的b山坳是0那么我想(例如)添加num和result从上一行。例如,如果b在该行中,1我想减去它们。
我尝试使用apply但我无法访问前一行,遗憾的是,如果我确实设法访问了前一行,数据框直到最后才会更新结果列。
我也尝试使用这样的循环,但对于我正在使用的大文件来说太慢了:
for i in range(1, len(df.index)):
row = df.index[i]
new_row = df.index[i - 1] …Run Code Online (Sandbox Code Playgroud) 我正在从一些类似于以下内容的文本文件中解析日期/时间/测量信息:
[Sun Jul 15 09:05:56.724 2018] *000129.32347
[Sun Jul 15 09:05:57.722 2018] *000129.32352
[Sun Jul 15 09:05:58.721 2018] *000129.32342
[Sun Jul 15 09:05:59.719 2018] *000129.32338
[Sun Jul 15 09:06:00.733 2018] *000129.32338
[Sun Jul 15 09:06:01.732 2018] *000129.32352
Run Code Online (Sandbox Code Playgroud)
结果进入输出文件,如下所示:
07-15-2018 09:05:56.724, 29.32347
07-15-2018 09:05:57.722, 29.32352
07-15-2018 09:05:58.721, 29.32342
07-15-2018 09:05:59.719, 29.32338
07-15-2018 09:06:00.733, 29.32338
07-15-2018 09:06:01.732, 29.32352
Run Code Online (Sandbox Code Playgroud)
我正在使用的代码如下所示:
import os
import datetime
with open('dq_barorun_20180715_calibtest.log', 'r') as fh, open('output.txt' , 'w') as fh2:
for line in fh:
line = line.split()
monthalpha = …Run Code Online (Sandbox Code Playgroud) 查询 a 的正确或最佳方法是什么pandas DataFrame?
这取决于用例,还是你可以说“总是使用 .query()”或“从不使用 .query()”?
\n我主要关心的是代码的稳健性或防错性,但性能当然也很重要。
\n在这篇文章中,查询方法被认为是稳健的并且比其他方法更受青睐,您同意吗?我应该始终使用 .query() 吗?
\n\n\npandas 中的 DataFrame.query() 函数是过滤 pandas DataFrame 对象行的强大方法之一。
\n最好使用 DataFrame.query() 函数来选择或过滤 pandas DataFrame 对象的行,而不是传统和常用的索引方法。
\n
我最近遇到了 .query() 方法,并开始经常使用它,以方便起见,因为我认为这是正确执行此操作的方法。
\n然后我读了这两篇文章(内容对于这个问题来说不是必需的,我只是想展示是什么让我思考这个问题):
\n\n和
\n如何处理Pandas中的SettingWithCopyWarning?
\n在帖子中SettingWithCopyWarning提到了 .loc 和 .at 等不同方法,但没有提到 .query()。这让我想知道 .query() 是否真的被使用了。(我想我开始一个新问题而不是在评论中发布这个问题)。它可能也与那个特定问题无关,但它仍然让我想知道。
关于“apply - 便利函数...”的帖子让我想知道 .query() 是否也是您永远不需要的便利函数。
\n该文档提到了以下用例:
\n\nquery() 用例
\nquery() 的一个用例是当您拥有 DataFrame …
某个数据框与以下数据框具有类似的中断:
import pandas as pd
df = pd.DataFrame({'name': ['John', 'Elvis', 'Gerrard', 'Pitty'],
'age': [22,23,24,25],
'document': [111,222,333,4444]})
Run Code Online (Sandbox Code Playgroud)
我怎样才能使过滤器仅返回文档列中的值只有3位数字的行?
我有这个数据框
temp = pd.DataFrame({'Person': ['P1', 'P2'], 'Dictionary': [{'value1': 0.31, 'value2': 0.304}, {'value2': 0.324}]})
Person Dictionary
0 P1 {'value1': 0.31, 'value2': 0.304}
1 P2 {'value2': 0.324}
Run Code Online (Sandbox Code Playgroud)
我想要这种格式的输出:
temp1 = pd.DataFrame({'Person': ['P1', 'P1', 'P2'], 'Values_Number': ['value1', 'value2', 'value2'], 'Values': [0.31, 0.304, 0.324]})
Run Code Online (Sandbox Code Playgroud)
我尝试使用这个:
temp['Dictionary'].apply(pd.Series).T.reset_index()
Run Code Online (Sandbox Code Playgroud)
Person Values_Number Values
0 P1 value1 0.310
1 P1 value2 0.304
2 P2 value2 0.324
Run Code Online (Sandbox Code Playgroud)
但我无法将其与之前的数据框连接起来。此外,我们也会有犯错误的机会。
我想根据两列 (index_start和index_end) 中的数值扩展我的数据框。我的 df 看起来像这样:
item index_start index_end
A 1 3
B 4 7
Run Code Online (Sandbox Code Playgroud)
我希望它扩展以创建从 1 到 3 的 A 行和从 4 到 7 的 B 行,就像这样。
item index_start index_end index
A 1 3 1
A 1 3 2
A 1 3 3
B 4 7 4
B 4 7 5
B 4 7 6
B 4 7 7
Run Code Online (Sandbox Code Playgroud)
不确定如何在 Python/pandas 中实现这一点。
我有以下 Pandas DataFrame,其中包含 city 和 arr 列:
city arr final_target
paris 11 paris_11
paris 12 paris_12
dallas 22 dallas
miami 15 miami
paris 16 paris_16
Run Code Online (Sandbox Code Playgroud)
我的目标是当城市名称是巴黎时,填充连接巴黎和arr号的final_target列,当名称不是巴黎时,只填充名称。
最Pythonic的方法是什么?
我在 pandas 中有以下数据框:
data = {
'idx': [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10],
'hue_val': ["A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","C","C","C","C","C","C","C","C","C","C",],
'value': np.random.rand(30),
}
df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)
现在我想通过每个“hue_val”的“idx”来绘制一个线图,其中包含该值的累积和。因此,最终将形成三条严格向上的曲线(因为它们是正数),一条代表“A”、“B”和“C”。
我在多个来源中找到了这段代码:
sns.lineplot(x="idx", y="value", hue="hue_val", data=df, estimator="cumsum")
Run Code Online (Sandbox Code Playgroud)