我在 macOS 上运行 Pandas 0.20.3 和 Python 3.5.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上被正确修改。但是,当我在具有相同 pandas 版本的 Windows 环境上运行此代码时,数据帧不会被修改。
因此我的问题是:上面的代码不正确吗?如果没有,如何正确完成我需要的作业?
最佳答案
我认为需要链 2 个 bool 掩码,其中选择 MultiIndex
级别的值 get_level_values
:
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
关于python - 如何正确分配给 pandas 中的多索引数据帧的切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51264932/