我正在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环境中运行此代码时,数据框不会被修改。
因此,我的问题是:上面的代码不正确吗?如果没有,如何正确分配我需要的作业?
答案 0 :(得分:1)
我认为需要链2布尔掩码,其选择值为get_level_values
的MultiIndex
级:
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