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 值的 NameCol
和 NumCol
列副本的情况下执行此操作?
最佳答案
这有效:
## 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/