将多索引中的条件列与同一索引对齐时出现问题

2024-04-16 05:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图添加一个条件列,它查看col1,如果等于'Hello'则返回True,否则返回False。问题是它似乎根据col1的字母顺序将其放置在

df = pd.DataFrame({'col1': ['A','B','Hello','C'],'col2':['foo','bar','baz','foz'], 'col3 ':['3','1','3','4']})
df.set_index(['col1', 'col2'],inplace=True) 

df['col4'] = df.index.levels[0].str.contains('Hello')

它回来了

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3  False
C     foz      4   True

但我要它回来

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3  True
C     foz      4  False

Tags: falsetruehellodfindexfoo字母bar
3条回答

因为index.levels[0]已经排序,所以使用reset_index

df['col4'] = df.reset_index()['col1'].str.contains('Hello').tolist()

现在:

print(df)

是:

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3   True
C     foz      4  False

而不是

df.index.levels[0].str.contains('Hello')

使用

df.index.get_level_values(0).str.contains('Hello')

其他的都一样。你知道吗

使用eval

df['col4'] = df.eval('col1 == "Hello"')
df

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3   True
C     foz      4  False

对于部分字符串搜索,请将str.containsengine='python'一起使用。你知道吗

df['col4'] = df.eval('col1.str.contains("Hello")', engine='python')
df

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3   True
C     foz      4  False

另一个选项是查询MultiIndex.get_level_values

df['col4'] = df.index.get_level_values('col1') == 'Hello'
df

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3   True
C     foz      4  False

如果这是部分字符串搜索问题,请在此处使用str.contains

df['col4'] = df.index.get_level_values('col1').str.contains('Hello')
df

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3   True
C     foz      4  False

最后,如果要执行相等比较(而不是部分字符串匹配),可以使用locpd.IndexSlice进行赋值:

df['col4'] = False
df.loc[pd.IndexSlice['Hello', :], 'col4'] = True
df

           col3    col4
col1  col2             
A     foo      3  False
B     bar      1  False
Hello baz      3   True
C     foz      4  False

相关问题 更多 >