繁体   English   中英

Python 数据操作 - pd.apply

[英]Python Data Manipulation - pd.apply

我在尝试从现有列创建新列时遇到问题。 我发现 the.apply 有效,但速度非常慢。 不幸的是,我公司没有人熟悉 Python。 有没有更有效的方法来执行以下操作?

数据集非常大 - 35 列,10M+ 行。

def state_grpd(x, y, z):
    if x in ["A3",]:
        if y in ["FL", "MI", "NJ", "TX",]:
            result = y
        else:
            result = "Other"
    else:
        if z in ["FL", "MI", "NJ", "TX",]:
            result = z
        else:
            result = "Other"
    return result

df["STATE_BANDED"] =  df.apply(
    lambda x: state_grpd(x["TYPE"], x["STATE1"], x["STATE2"]), axis=1)

pandarallel 可能会解决您的问题。 它使 pandas function 在多核而不是单核中完成工作**(并行化任务)**。

通读这个 -

https://towardsdatascience.com/pandaral-lel-a-simple-and-efficient-tool-to-parallelize-your-pandas-operations-on-all-your-cpus-bb5ff2a409ae

您可以创建一个单独的表并加入它。 我不确定 join 是否比 apply 方法快。 我听说矢量化function 也有帮助。

我认为这应该对你有用。

import swifter

df["STATE_BANDED"] =  df.swifter.apply(
    lambda x: state_grpd(x["TYPE"], x["STATE1"], x["STATE2"]), axis=1)

试试这个。 它可能会快一点。

import pandas as pd

data = {'type': ['A3', 'A3', 'A3', 'A3', 'A1', 'A1', 'A1', 'A1', 'A2', 'A2'],
        'state1': ['FL', 'MI', 'NJ', 'TX', 'CT', 'MA', 'NH', 'FL', 'CA', 'OR'],
        'state2': ['NY', 'MS', 'NH', 'CT', 'FL', 'MI', 'NJ', 'TX', 'CA', 'OR']
        }

df = pd.DataFrame(data)
df['state_banned'] = 'Other'

mask = (df['type'] == 'A3') & (df['state1'].isin(['FL', 'MI', 'NJ', 'TX']))
df['state_banned'][mask] = df['state1'][mask]

mask = (df['type'] != 'A3') & (df['state2'].isin(['FL', 'MI', 'NJ', 'TX']))
df['state_banned'][mask] = df['state2'][mask]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM