为了账号安全,请及时绑定邮箱和手机立即绑定

在等于值的地方分配列 - pandas df

在等于值的地方分配列 - pandas df

慕斯王 2021-11-16 10:32:25
我试图assign在pandas df. 具体来说,对于df下面的内容,我想用它Column['On']来确定当前发生了多少个值。然后我想将这些值以3. 所以值;1-3 = 14-6 = 27-9 = 3 etc这可以达到 20-30 个值。我考虑过 np.where 但它不是很有效而且我返回了一个错误。import pandas as pdimport numpy as npd = ({                    'On' : [1,2,3,4,5,6,7,7,6,5,4,3,2,1],                                           })df = pd.DataFrame(data=d)此调用有效:df['P'] = np.where(df['On'] == 1, df['On'],1)但是,如果我想将此应用于其他值,则会出现错误:df = df['P'] = np.where(df['On'] == 1, df['On'],1)df = df['P'] = np.where(df['On'] == 2, df['On'],1)df = df['P'] = np.where(df['On'] == 3, df['On'],1)IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

你可以使用系列面具和 loc


df['P'] = float('nan')

df['P'].loc[(df['On'] >= 1) & (df['On'] <= 3)] = 1

df['P'].loc[(df['On'] >= 4) & (df['On'] <= 6)] = 2

# ...etc

用循环扩展它很容易


j = 1

for i in range(1, 20):

    df['P'].loc[(df['On'] >= j) & (df['On'] <= (j+2))] = i

    j += 3


查看完整回答
反对 回复 2021-11-16
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

通过一些基本的数学和矢量化,您可以获得更好的性能。


import pandas as pd

import numpy as np

n = 1000 

df = pd.DataFrame({"On":np.random.randint(1,20, n)})

AlexG的解决方案


%%time

j = 1

df["P"] =  np.nan

for i in range(1, 20):

    df['P'].loc[(df['On'] >= j) & (df['On'] <= (j+2))] = i

    j += 3


CPU times: user 2.11 s, sys: 0 ns, total: 2.11 s

Wall time: 2.11 s

建议的解决方案


%%time

df["P"] = np.ceil(df["On"]/3)



CPU times: user 2.48 ms, sys: 0 ns, total: 2.48 ms

Wall time: 2.15 ms

加速是 ~1000 倍


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信