如何更改 Pandas 中 MultiIndex Dataframe 的列中某些行的值
How to change the values of certain rowns in a column of a MultiIndex Dataframe in Pandas
我有一个包含以下列的数据框 (df):
print(df.columns)
['A','B','C','D','E']
并且假设所有列都有数字作为数据。
然后我select一些列成为索引
Index = ['A','B','C']
df.set_index(Index).sort_index()
我以这种方式使用它 analysis.At 当索引 'C' 具有某些值时,我需要更改列 'E' 的行,例如:
df.loc[df[(slice(None,None),slice(None,None),slice(5,10))], 'E' ] = 6
这显然行不通。我尝试了很多不同的方法:使用元组和切片作为索引,如我上面的行所示,重新排列索引以便我可以使用单个切片(将 'C' 移动到第一级),尝试使用.xs(横截面)等,我做不到。 (我一直在研究 .loc、.xs 等的文档)我没有找到一个例子可以做到这一点,也没有找到确定的答案,这是不可能的。现在我能够做到以下几点:
df.reset_index(inplace=True) # returning it back into a normal DataFrame
df.loc[(DataFrame['C'] >= 5) & (df['C'] <= 10),'E'] = 6 # Modifying normally based on column data
df.set_index(Index).sort_index() # bring it back to a multiindex
但这似乎不对。在我看来,索引应该能够以某种方式被切片,我只是找不到如何。也许我没有在 Google 上搜索正确的术语。如果有人能帮助我或指出正确的方向,我将不胜感激。
您可以使用 df.index.get_level_values('C')
——其中 returns 值的索引数组——如下所示。
import pandas as pd
df = pd.DataFrame(np.random.randint(0,10,size=(100, 5)), columns=list('ABCDE'))
df = df.set_index(['A','B','C']).sort_index()
df.loc[(df.index.get_level_values('C') <= 10) & (df.index.get_level_values('C') >= 5), 'E'] = 6
print(df)
结果:
D E
A B C
0 0 6 3 6
2 0 6 1
7 2 6
3 6 5 6
9 1 6
... .. ..
9 3 3 5 0
6 6 6
4 3 5 7
7 6 6
6 8 6 6
注意:.get_level_values()
两边的括号是必需的,否则答案不明确,会引发错误。
我有一个包含以下列的数据框 (df):
print(df.columns)
['A','B','C','D','E']
并且假设所有列都有数字作为数据。
然后我select一些列成为索引
Index = ['A','B','C']
df.set_index(Index).sort_index()
我以这种方式使用它 analysis.At 当索引 'C' 具有某些值时,我需要更改列 'E' 的行,例如:
df.loc[df[(slice(None,None),slice(None,None),slice(5,10))], 'E' ] = 6
这显然行不通。我尝试了很多不同的方法:使用元组和切片作为索引,如我上面的行所示,重新排列索引以便我可以使用单个切片(将 'C' 移动到第一级),尝试使用.xs(横截面)等,我做不到。 (我一直在研究 .loc、.xs 等的文档)我没有找到一个例子可以做到这一点,也没有找到确定的答案,这是不可能的。现在我能够做到以下几点:
df.reset_index(inplace=True) # returning it back into a normal DataFrame
df.loc[(DataFrame['C'] >= 5) & (df['C'] <= 10),'E'] = 6 # Modifying normally based on column data
df.set_index(Index).sort_index() # bring it back to a multiindex
但这似乎不对。在我看来,索引应该能够以某种方式被切片,我只是找不到如何。也许我没有在 Google 上搜索正确的术语。如果有人能帮助我或指出正确的方向,我将不胜感激。
您可以使用 df.index.get_level_values('C')
——其中 returns 值的索引数组——如下所示。
import pandas as pd
df = pd.DataFrame(np.random.randint(0,10,size=(100, 5)), columns=list('ABCDE'))
df = df.set_index(['A','B','C']).sort_index()
df.loc[(df.index.get_level_values('C') <= 10) & (df.index.get_level_values('C') >= 5), 'E'] = 6
print(df)
结果:
D E
A B C
0 0 6 3 6
2 0 6 1
7 2 6
3 6 5 6
9 1 6
... .. ..
9 3 3 5 0
6 6 6
4 3 5 7
7 6 6
6 8 6 6
注意:.get_level_values()
两边的括号是必需的,否则答案不明确,会引发错误。