无法将多索引中的条件列对齐到同一索引

时间:2019-03-26 03:04:59

标签: python pandas dataframe indexing multi-index

我试图添加一个条件列,该条件列查看col1,如果等于“ Hello”,则返回True,否则返回False。问题在于它似乎基于col1的字母顺序放置在

your_data = read.table(header = T, text = '      date           oneweeksince victims
1    2009-01-01         FALSE      NA
2    2009-01-02         FALSE      NA
3    2009-01-03         FALSE      NA
4    2009-01-04         FALSE      NA
5    2009-01-05         FALSE      NA
6    2009-01-06         FALSE      NA
7    2009-01-07         FALSE      NA
8    2009-01-08          TRUE       1
9    2009-01-09          TRUE      NA
10   2009-01-10          TRUE      NA
11   2009-01-11          TRUE      NA
12   2009-01-12          TRUE      NA
13   2009-01-13          TRUE      NA
14   2009-01-14          TRUE      NA
15   2009-01-15          TRUE      NA
16   2009-01-16         FALSE      NA
17   2009-01-17         FALSE      NA
18   2009-01-18         FALSE      NA
19   2009-01-19         FALSE      NA
20   2009-01-20         FALSE      NA')

正在返回

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

3 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:0)

这是因为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

答案 2 :(得分:0)

代替

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

使用

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

其余所有内容保持不变。