python mulit函数_python – 将函数应用于MultiIndex pandas.DataFrame列

我有一个MultiIndex pandas DataFrame,我想在其中的一个列中应用一个函数,并将结果分配给同一列.

In [1]:

import numpy as np

import pandas as pd

cols = ['One', 'Two', 'Three', 'Four', 'Five']

df = pd.DataFrame(np.array(list('ABCDEFGHIJKLMNO'), dtype='object').reshape(3,5), index = list('ABC'), columns=cols)

df.to_hdf('/tmp/test.h5', 'df')

df = pd.read_hdf('/tmp/test.h5', 'df')

df

Out[1]:

One Two Three Four Five

A A B C D E

B F G H I J

C K L M N O

3 rows × 5 columns

In [2]:

df.columns = pd.MultiIndex.from_arrays([list('UUULL'), ['One', 'Two', 'Three', 'Four', 'Five']])

df['L']['Five'] = df['L']['Five'].apply(lambda x: x.lower())

df

-c:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.

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

Out[2]:

U L

One Two Three Four Five

A A B C D E

B F G H I J

C K L M N O

3 rows × 5 columns

In [3]:

df.columns = ['One', 'Two', 'Three', 'Four', 'Five']

df

Out[3]:

One Two Three Four Five

A A B C D E

B F G H I J

C K L M N O

3 rows × 5 columns

In [4]:

df['Five'] = df['Five'].apply(lambda x: x.upper())

df

Out[4]:

One Two Three Four Five

A A B C D E

B F G H I J

C K L M N O

3 rows × 5 columns

正如您所看到的,该函数未应用于列,我猜是因为我收到此警告:

-c:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.

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

奇怪的是,这个错误有时只会发生,我无法理解它何时发生,何时不发生.

我设法应用函数切片数据框与.loc作为建议的警告:

In [5]:

df.columns = pd.MultiIndex.from_arrays([list('UUULL'), ['One', 'Two', 'Three', 'Four', 'Five']])

df.loc[:,('L','Five')] = df.loc[:,('L','Five')].apply(lambda x: x.lower())

df

Out[5]:

U L

One Two Three Four Five

A A B C D e

B F G H I j

C K L M N o

3 rows × 5 columns

但是我想理解为什么这种行为在进行类似dict的切片时会发生(例如df [‘L’] [‘Five’])而不是在使用.loc切片时.

注意:DataFrame来自一个没有多索引的HDF文件,这可能是奇怪行为的原因?

编辑:我正在使用Pandas v.0.13.1和NumPy v.1.8.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值