python - 如何正确分配给 pandas 中的多索引数据帧的切片?

标签 python pandas dataframe

我在 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/

相关文章:

python - 检查数组中的元素是否存在于 Pandas DataFrame 中

python - 按日期时间间隔计算记录数

如果某些子记录不存在,python json.normalize 会出错

Python round 不返回整数

python - 使用 str.contains 选择包含搜索词列表中所有字符串的数据帧行

Python:从列表创建协方差矩阵

python - 大型(ish)django 应用程序架构

python - 如何从具有不同长度列表的字典创建字典列表

python - 密码未使用 Django 以及一些缺失的列进行哈希处理

python - Kivy重复 Action