我有一个熊猫框架“df”如下:
col1 col_group
0 1 1
1 -1 0
2 -2 0
3 4 2
4 2 1
我正在尝试复制'col1'中的值,除非我想修改'col1'中的值,如果它们位于'col_group'0或2中。修改只是将现有值乘以50 %。我需要在1MM +行上执行此操作,因此我想知道是否有最佳方法来生成新列?
所以我想要的输出是:
col1 col_group New
0 1 1 1
1 -1 0 -0.5
2 -2 0 -1
3 4 2 2
4 2 1 2
我目前正在使用for循环,但认为pandas可能会有更快的东西。
谢谢
答案 0 :(得分:2)
df['new_col'] = df.apply( lambda x: x['col1'] * .5
if x['col_group'] in (0, 2) else x['col1'],
axis=1)
答案 1 :(得分:2)
pandas
boolean
数学isin([0, 2])
提供True
/ False
div(-2)
将True
转为-.5
,False
为0
add(1)
将True
转为.5
和False
为1
df.assign(New=df.col1 * df.col_group.isin([0, 2]).div(-2).add(1))
numpy.where
df.assign(New=np.where(df.col_group.isin([0, 2]), df.col1 * .5, df.col1))
均为
col1 col_group New
0 1 1 1.0
1 -1 0 -0.5
2 -2 0 -1.0
3 4 2 2.0
4 2 1 2.0
答案 2 :(得分:2)
您可以尝试布尔索引。
df['col2'] = df['col1']
df['col2'].iloc[:][(df[col_group]==0) | df[col_group]==2)] /= 2