如何正确分配熊猫中多索引数据框的一部分?

时间:2018-07-10 12:14:29

标签: python pandas dataframe

我正在macOS上使用Python 3.5.3运行Pandas 0.20.3。

我有一个类似于以下df的多索引数据框:

import pandas as pd
import numpy as np

refs = ['A', 'B']
dates = pd.date_range(start='2018-01-01', end='2018-12-31')

df = pd.DataFrame({'ref': np.repeat(refs, len(dates)),
                  'date': np.tile(dates, len(refs)),
                  'value': np.random.randn(len(dates) * len(refs))})
df.set_index(["ref", "date"], inplace=True)

我想修改数据框并将某些值设置为0。假设ref等于'A',并且日期在2018-01-15之前。

我正在使用以下内容:

df.loc["A"].loc[df.loc["A"].index < pd.to_datetime('2018-01-15')] = 0

我没有得到任何SettingWithCopyWarning,并且在我的Mac上正确修改了数据框。但是,当我在具有相同熊猫版本的Windows环境中运行此代码时,数据框不会被修改。

因此,我的问题是:上面的代码不正确吗?如果没有,如何正确分配我需要的作业?

1 个答案:

答案 0 :(得分:1)

我认为需要链2布尔掩码,其选择值为get_level_valuesMultiIndex级:

m1 = df.index.get_level_values(0) == 'A'
m2 = df.index.get_level_values(1) < '2018-01-15'

df.loc[m1 & m2, 'value'] = 0

print (df.head(20))
                   value
ref date                
A   2018-01-01  0.000000
    2018-01-02  0.000000
    2018-01-03  0.000000
    2018-01-04  0.000000
    2018-01-05  0.000000
    2018-01-06  0.000000
    2018-01-07  0.000000
    2018-01-08  0.000000
    2018-01-09  0.000000
    2018-01-10  0.000000
    2018-01-11  0.000000
    2018-01-12  0.000000
    2018-01-13  0.000000
    2018-01-14  0.000000
    2018-01-15 -0.701757
    2018-01-16 -0.160638
    2018-01-17 -0.226917
    2018-01-18 -0.431952
    2018-01-19 -0.339794
    2018-01-20 -0.050133