df满足条件的值修改_使用多级列在Pandas DF中有条件地更改值

本文介绍了如何在具有多级列的Pandas DataFrame中有效地更改值。当foo子列的值小于0.5时,尝试将其设置为100,但遇到了SettingWithCopyWarning和ValueError。通过比较不同方法,如使用applymap、fillna和直接操作数组,最终发现直接操作数组的方法在处理大规模数据时更为高效。
摘要由CSDN通过智能技术生成

给定以下具有多级列的DF:arrays = [['foo', 'foo', 'bar', 'bar'],

['A', 'B', 'C', 'D']]

tuples = list(zip(*arrays))

columnValues = pd.MultiIndex.from_tuples(tuples)

df = pd.DataFrame(np.random.rand(6,4), columns = columnValues)

df['txt'] = 'aaa'

print(df)

产量:

^{pr2}$

问题:如何有效地将foo子列中的值改为100,如果它们的值< 0.5,那么对于巨大的DF?在

以下工作:In [41]: df.foo < 0.5

Out[41]:

A B

0 True False

1 True False

2 True True

3 False False

4 True True

5 True True

In [42]: df.foo[df.foo < 0.5]

Out[42]:

A B

0 0.080029 NaN

1 0.276949 NaN

2 0.416714 0.440659

3 NaN NaN

4 0.191245 0.291017

5 0.365464 0.286350

但如果我试图改变它给我的值:In [45]: df.foo[df.foo < 0.5] = 100

C:\Users\USER\AppData\Local\Programs\Python35\Scripts\ipython:1: SettingWithCopyWarning:

A value is trying to be set on a copy of a slice from a DataFrame.

Try using .loc[row_indexer,col_indexer] = value instead

如果我尝试使用定位器:In [46]: df.foo.loc[df.foo < 0.5] = 100

...

ValueError: cannot copy sequence with size 2 to array axis with dimension 6

df.foo.loc[df.foo < 0.5, 'foo'] = 100的相同错误

如果我尝试:df.loc[df.foo < 0.5, 'foo']

我得到:KeyError: 'None of [ A B\n0 True False\n1 True False\n2 True True\n3 False False\n4 True True\n5 True True] are in the [index]'

解决方案-timeit与10M行的DF进行比较:In [19]: %timeit df.foo.applymap(lambda x: x if x >= 0.5 else 100)

1 loop, best of 3: 29.4 s per loop

In [20]: %timeit df.foo[df.foo >= 0.5].fillna(100)

1 loop, best of 3: 1.55 s per loop

约翰·高尔特:

^{9}$

B.M.:In [5]: %timeit u=df['foo'].values;u[u<.5>

1 loop, best of 3: 628 ms per loop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值