python - 引用 DataFrame 的 MultiIndex 值不正确吗?

标签 python pandas dataframe multi-index

Pandas 似乎抵制将 DataFrame 索引值当作列值使用的努力。因此,我经常将它们复制到一列中,以便我可以引用它们进行计算。这是一个好的做法吗?或者我是否缺少引用索引值的“正确”方法?

考虑以下示例:

j = [(a, b) for a in ['A','B','C'] for b in random.sample(range(1, 100), 5)]
i = pd.MultiIndex.from_tuples(j, names=['Name','Num'])
df = pd.DataFrame(np.random.randn(15), i, columns=['Vals'])

现在假设我想向 DataFrame 添加一列 'SmallestNum' ,列出每个关联索引 Name 的最小索引 Num

目前我能找到让它工作的唯一方法(假设 MultiIndex 很大并且我没有方便的元组)是:

首先:将两个索引级别复制到 DataFrame 的列中:

df['NameCol'] = df.index.get_level_values(0)
df['NumCol'] = df.index.get_level_values(1)

否则,我无法弄清楚如何获得每个 Name 的最小 Num 值。至少现在我可以通过:

smallest = pd.DataFrame(df.groupby(['Name'])['NumCol'].min())

最后,我可以将这些数据合并回 DataFrame 作为新列,但这仅仅是因为我可以引用 NameCol:

df.merge(smallest.rename(columns={'NumCol' : 'SmallestNum'}), how='left', right_index=True, left_on=['NameCol'])

有没有办法在不创建 MultiIndex 值的 NameColNumCol 列副本的情况下执行此操作?

最佳答案

这有效:

## get smallest values per Name
vals = df.reset_index(level=1).groupby('Name')['Num'].min()

## map the values to df
df['SmallestNum'] = pd.Series(df.index.get_level_values(0)).map(vals).values

关于python - 引用 DataFrame 的 MultiIndex 值不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967953/

相关文章:

python - 循环遍历列表并在找到第一个字符串时停止

python - Theano 测试文件无法编译

python - 使用字典映射将格式应用于 Dataframe 中的每一列

python - 绘制从同一图形 Python 中的循环获得的两个数据帧

r - 如何使用多列和参数 "split"创建一个箱线图

python - 来自数组的 Pandas Multiindex => TypeError : unhashable type: 'dict'

python - AttributeError: 'function' 对象没有属性 'replace'

python - Zinnia 在 MySQL 后端的 QuerySet.datetimes() 中返回了无效值

python - 读取文件时使用 lambda 函数将日期转换为时间戳

python - 从 Pandas 索引中查找整数行索引