【问题标题】:Trouble aligning conditional column in multi-index to the same index无法将多索引中的条件列与同一索引对齐
【发布时间】:2019-08-16 08:54:14
【问题描述】:

我正在尝试添加一个查看 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

【问题讨论】:

  • 您是在寻找完整的字符串匹配还是部分匹配?

标签: python pandas dataframe indexing multi-index


【解决方案1】:

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

【讨论】:

  • @chicken4yue 请在此处选择最有帮助的答案和mark it accepted。谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    代替

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

    使用

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

    并保持所有休息相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 2010-09-15
      • 2020-10-08
      • 1970-01-01
      • 2018-07-27
      • 2017-06-17
      • 2018-09-17
      相关资源
      最近更新 更多