如何用熊猫数据框中的范围替换列值
Posted
技术标签:
【中文标题】如何用熊猫数据框中的范围替换列值【英文标题】:how to replace column value with range in pandas dataframe 【发布时间】:2017-10-31 08:51:38 【问题描述】:我有一个名为“df”的数据框,我想用另一列中的相应值替换数据框中一系列列中的值。
6
11
16
21
age
86508 12.0
86509 6.0
86510 7.0
86511 8.0
86512 10.0
86513 15.0
86514 15.0
86515 16.0
86516 20.0
86517 23.0
86518 23.0
86519 7.0
86520 18.0
结果是
age stage
86508 12.0 2
86509 6.0 1
86510 7.0 1
86511 8.0 1
86512 10.0 1
86513 15.0 2
86514 15.0 2
86515 16.0 2
86516 20.0 3
86517 23.0 4
86518 23.0 4
86519 7.0 1
86520 18.0 3
谢谢。
【问题讨论】:
【参考方案1】:使用pd.cut():
In [37]: df['stage'] = pd.cut(df.age, bins=[0,11,16,21,300], labels=[1,2,3,4])
In [38]: df
Out[38]:
age stage
86508 12.0 2
86509 6.0 1
86510 7.0 1
86511 8.0 1
86512 10.0 1
86513 15.0 2
86514 15.0 2
86515 16.0 2
86516 20.0 3
86517 23.0 4
86518 23.0 4
86519 7.0 1
86520 18.0 3
或more generic solution provided by @ayhan:
In [39]: df['stage'] = pd.cut(df.age, bins=[0, 11, 16, 21, np.inf], labels=False, right=True) + 1
In [40]: df
Out[40]:
age stage
86508 12.0 2
86509 6.0 1
86510 7.0 1
86511 8.0 1
86512 10.0 1
86513 15.0 2
86514 15.0 2
86515 16.0 2
86516 20.0 3
86517 23.0 4
86518 23.0 4
86519 7.0 1
86520 18.0 3
【讨论】:
不错!比使用条件语句要好得多。 很好的答案!对于这种情况,我总是忘记 pd.cut 。下次:) @谢谢你们! :-)pd.cut(df.age, bins=[0, 11, 16, 21, np.inf], labels=False, right=True) + 1
可能更通用(对于垃圾箱和标签)。【参考方案2】:
使用np.searchsorted
a = np.array([-np.inf, 6, 11, 16, 21, np.inf])
df.assign(stage=a.searchsorted(df.age, side='right') - 1)
age stage
86508 12.0 2
86509 6.0 1
86510 7.0 1
86511 8.0 1
86512 10.0 1
86513 15.0 2
86514 15.0 2
86515 16.0 3
86516 20.0 3
86517 23.0 4
86518 23.0 4
86519 7.0 1
86520 18.0 3
时机小数据
%%timeit
a = np.array([-np.inf, 6, 11, 16, 21, np.inf])
df.assign(stage=a.searchsorted(df.age, side='right') - 1)
1000 loops, best of 3: 288 µs per loop
%%timeit
df.assign(stage=pd.cut(df.age, bins=[0,11,16,21,300], labels=[1,2,3,4]))
1000 loops, best of 3: 668 µs per loop
【讨论】:
更新我的实用功能包:) +1以上是关于如何用熊猫数据框中的范围替换列值的主要内容,如果未能解决你的问题,请参考以下文章