我试图添加一个条件列,该条件列查看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
答案 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.contains
与engine='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
最后,如果要执行相等比较(而不是部分字符串匹配),则可以使用loc
和pd.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')
其余所有内容保持不变。