相关疑难解决方法(0)

熊猫 - 应用函数缓慢的解释

对于大型数据帧(大约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)

我想对于第一种情况,它可以通过数据帧连接完成,而我不确定这种连接在大型数据集上的资源成本.

我的问题是:

  1. 在上述两种情况下,有没有办法替代申请?
  2. 为什么这么慢?对于dict查找案例,我认为它应该是O(N),即使N是100万,也不应该花费那么多.

python pandas

6
推荐指数
1
解决办法
9654
查看次数

为什么有时候应用并不比pandas数据帧中的for-loop更快?

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)

任何人都可以解释原因吗?

python pandas

6
推荐指数
1
解决办法
8062
查看次数

如何使用前几行的数据在数据框列上应用函数?

我有一个包含三列的数据框: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)

python vectorization apply dataframe pandas

5
推荐指数
2
解决办法
289
查看次数

有没有更快的方法来解析这个文本文件?

我正在从一些类似于以下内容的文本文件中解析日期/时间/测量信息:

[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)

python optimization file

5
推荐指数
1
解决办法
1906
查看次数

何时在 pandas 数据框中使用 .query() 而不是 .loc?

问题

\n

查询 a 的正确或最佳方法是什么pandas DataFrame?

\n

这取决于用例,还是你可以说“总是使用 .query()”或“从不使用 .query()”?

\n

我主要关心的是代码的稳健性或防错性,但性能当然也很重要。

\n

在这篇文章中,查询方法被认为是稳健的并且比其他方法更受青睐,您同意吗?我应该始终使用 .query() 吗?

\n
\n

pandas 中的 DataFrame.query() 函数是过滤 pandas DataFrame 对象行的强大方法之一。

\n

最好使用 DataFrame.query() 函数来选择或过滤 pandas DataFrame 对象的行,而不是传统和常用的索引方法。

\n
\n

背景

\n

我最近遇到了 .query() 方法,并开始经常使用它,以方便起见,因为我认为这是正确执行此操作的方法。

\n

然后我读了这两篇文章(内容对于这个问题来说不是必需的,我只是想展示是什么让我思考这个问题):

\n

apply,您从未需要的便捷功能

\n

和

\n

如何处理Pandas中的SettingWithCopyWarning?

\n

在帖子中SettingWithCopyWarning提到了 .loc 和 .at 等不同方法,但没有提到 .query()。这让我想知道 .query() 是否真的被使用了。(我想我开始一个新问题而不是在评论中发布这个问题)。它可能也与那个特定问题无关,但它仍然让我想知道。

\n

关于“apply - 便利函数...”的帖子让我想知道 .query() 是否也是您永远不需要的便利函数。

\n

该文档提到了以下用例:

\n
\n

query() 用例

\n

query() 的一个用例是当您拥有 DataFrame …

python dataframe pandas

5
推荐指数
1
解决办法
2318
查看次数

熊猫:处理数据框

某个数据框与以下数据框具有类似的中断:

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位数字的行?

python pandas

4
推荐指数
1
解决办法
45
查看次数

将包含字典的 pandas 列转换为多行

我有这个数据框

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)

但我无法将其与之前的数据框连接起来。此外,我们也会有犯错误的机会。

python pandas

4
推荐指数
1
解决办法
961
查看次数

根据列值生成行数 - Pandas/Python

我想根据两列 (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 中实现这一点。

python dataframe pandas

4
推荐指数
1
解决办法
77
查看次数

将 pandas 单元格与条件连接起来的最 Pythonic 方法

我有以下 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的方法是什么?

python dataframe python-3.x pandas

4
推荐指数
1
解决办法
147
查看次数

Seaborn:累积总和和色调

我在 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)

这并不能解决问题,因为曲线和 x 轴都是假的: 在此输入图像描述

python visualization python-3.x pandas seaborn

3
推荐指数
1
解决办法
1700
查看次数