是否有更快的方法根据条件更新数据框列值?

2024-06-03

我正在尝试处理数据框。这包括创建新列并根据其他列中的值更新其值。更具体地说,我有一个预定义的“源”,我想对其进行分类。该来源可以分为三个不同的类别“source_dtp”、“source_dtot”和“source_cash”。我想向数据框中添加三个新列,这些新列由基于原始“源”列的 1 或 0 组成。

我目前能够做到这一点,只是真的很慢...

原始专栏示例:

source
_id                     
AV4MdG6Ihowv-SKBN_nB    DTP
AV4Mc2vNhowv-SKBN_Rn    Cash 1
AV4MeisikOpWpLdepWy6    DTP
AV4MeRh6howv-SKBOBOn    Cash 1
AV4Mezwchowv-SKBOB_S    DTOT
AV4MeB7yhowv-SKBOA5b    DTP

期望的输出:

source_dtp  source_dtot source_cash
_id         
AV4MdG6Ihowv-SKBN_nB    1.0 0.0 0.0
AV4Mc2vNhowv-SKBN_Rn    0.0 0.0 1.0
AV4MeisikOpWpLdepWy6    1.0 0.0 0.0
AV4MeRh6howv-SKBOBOn    0.0 0.0 1.0
AV4Mezwchowv-SKBOB_S    0.0 1.0 0.0
AV4MeB7yhowv-SKBOA5b    1.0 0.0 0.0

这是我目前的方法,但速度很慢。我更喜欢矢量化的形式来执行此操作,但我不知道如何操作 - 因为条件非常复杂。

# For 'source' we will use the following classes:
source_cats = ['source_dtp', 'source_dtot', 'source_cash']
# [0, 0, 0] would imply 'other', hence no need for a fourth category

# add new features to dataframe, initializing to nan
for cat in source_cats:
    data[cat] = np.nan

for row in data.itertuples():
    # create series to hold the result per row e.g. [1, 0, 0] for `cash`
    cat = [0, 0, 0]
    index = row[0]
    # to string as some entries are numerical
    source_type = str(data.loc[index, 'source']).lower()
    if 'dtp' in source_type:
        cat[0] = 1
    if 'dtot' in source_type:
        cat[1] = 1
    if 'cash' in source_type:
        cat[2] = 1
    data.loc[index, source_cats] = cat

我正在使用 itertuples(),因为事实证明它比 interrows() 更快。

有没有faster如何实现与上述相同的功能?

编辑:这不仅仅是关于创建一种热门编码。它归结为根据另一列的值更新列值。例如。如果我有一定的location_id我想更新其各自的longitude and latitudecolumns - 基于原始 id (无需按照我上面的方式进行迭代,因为对于大型数据集来说它确实很慢)。


另一种方法是使用pd.get_dummies https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html#pandas-get-dummies在数据框上。首先将“_id”放入索引中。

source = source.set_index('_id')
df_out = pd.get_dummies(source).reset_index()

print(df_out)

Output:

                    _id  source_Cash 1  source_DTOT  source_DTP
0  AV4MdG6Ihowv-SKBN_nB              0            0           1
1  AV4Mc2vNhowv-SKBN_Rn              1            0           0
2  AV4MeisikOpWpLdepWy6              0            0           1
3  AV4MeRh6howv-SKBOBOn              1            0           0
4  AV4Mezwchowv-SKBOB_S              0            1           0
5  AV4MeB7yhowv-SKBOA5b              0            0           1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有更快的方法根据条件更新数据框列值? 的相关文章

随机推荐