我有一个数据框,其中一些索引包含不需要的字符,主要是括号“(”。循环需要遍历每一行并消除“(”及其后的所有内容。
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
guard let window = NSApplication.shared.windows.first else { return }
window.isOpaque = false
window.backgroundColor = .clear
}
问题在于它消除了每个条目的额外字符。例如,当索引是abcd时,它会将其更改为abc。如果索引是abcd(blah),那么它将索引条目更改为abcd。如何防止它消除额外的角色?
答案 0 :(得分:3)
给出如下数据框:
df = pd.DataFrame({'A' : ['one(two)', 'five (three)two', '(blah)two', '1 three blah haha1'], 'B': [100,200,300,400]})
df = df.set_index('A')
B
A
one(two) 100
five (three)two 200
(blah)two 300
three blah haha1 400
df.index = df.index.str.extract('([\s\w]*)\(*')
会给你
B
A
one 1
five 2
3
three blah haha 1 4
答案 1 :(得分:1)
首先,你应该避免在熊猫中使用循环。它们表现不佳,当你操纵整个数据集而不是迭代for循环中的行时,Pandas会更有效。
假设您只想删除括号
import re
def remove_parentheses(x):
return re.sub(r'\([^)]*\)', '', x['field'])
然后
df['index'] = df.apply(lambda x: remove_parentheses(x), axis = 1)
答案 2 :(得分:1)
对于index为abcd的情况,它会更改为abc,因为index.rfind("(")
返回-1
,因为找不到"("
。这导致index = index[:-1]
您应该检查索引中的"("
何时以及何时不是。你可以这样做:
for index, row in df.iterrows():
if index.rfind("(") != -1:
index = index[:index.rfind("(")]
newindexlist.append(index)
df.index = newindexlist
答案 3 :(得分:1)
如何更简单的东西(尽管使用正则表达式很诱人)
import pandas as pd
import re
pattern = r"(.*)\("
df = pd.DataFrame(index=["abcd(blah)", "abcd",])
print df.index
Index([u'abcd(blah)', u'abcd'], dtype='object')
df = df.reset_index()
df['index'] = df['index'].apply(lambda x: x.split("(")[0])
df.set_index("index", inplace=True)
print df.index
Index([u'abcd', u'abcd'], dtype='object', name=u'index')