如何使用pandas.DataFrame.replace
替换 pandas 数据框中所有出现的字符串?
这似乎是一个相当愚蠢的问题,但是请take a look here ,
即,在以下三个 DataFrame.replace
中,只有一个有效,其他两个无效。我该如何修复它们?
另外,如何限制第一列内的替换? (我尝试使用 , axis=1
,但被告知它现已弃用)。谢谢。
df = pd.DataFrame({'A': np.random.choice(['foo', 'bar'], 100),
'B': np.random.choice(['one', 'two', 'three'], 100),
'C': np.random.choice(['I1', 'I2', 'I3', 'I4'], 100),
'D': np.random.randint(-10,11,100),
'E': np.random.randn(100)})
p = pd.pivot_table(df, index=['A','B'], columns='C', values='D')
df.replace("fo","fu", regex=True,inplace=True)
p.replace("fo","fu", regex=True,inplace=True)
p.index = p.index.to_series().str.join('-')
r=p.copy()
r.replace("fo","fu", regex=True,inplace=True)
最佳答案
仅在一列中进行替换
将该列作为系列获取并使用 Series.replace
方法:
df['A'] = df['A'].replace("fo", "fu", regex=True)
或
df['A'].replace("fo", "fu", regex=True, inplace=True)
在索引中进行替换
Series.replace
和 DataFrame.replace
均仅作用于数据本身,而不作用于索引。您需要将索引重置为列,进行替换并重新设置索引。
r = p.copy()
r.index = r.index.to_series().str.join('-')
r.index.name = 'A-B'
r = (r.reset_index() # reset the index
.replace('fo', 'fu', regex=True) # make the replacement
.set_index('A-B')) # set the index again
您可以将其与上面的内容结合起来 - 因此替换仅发生在索引中。
r = p.copy()
r.index = r.index.to_series().str.join('-')
r.index.name = 'A-B'
r = r.reset_index()
r['A-B'] = r['A-B'].replace('fo', 'fu', regex=True)
r = r.set_index('A-B')
@juanpa.arrivilillaga 的代码更短:
r.index = r.index.to_series().replace('fo','fu', regex=True)
在MultiIndex
中进行替换
同样,您需要重置所需的 MultiIndex
级别,进行替换并将其放回索引中。
p = (p.reset_index(level='A') # reset only level 'A'
.replace('fo', 'fu', regex=True) # make the replacement
.set_index('A', append=True) # send 'A' to the index again
.swaplevel()) # if you want 'A' before 'B'
或者,仅在该索引级别进行替换:
p = p.reset_index(level='A')
p['A'] = p['A'].replace('fo', 'fu', regex=True)
p = p.set_index('A', append=True).swaplevel()
但请注意
p.index = p.index.to_series().replace('fo', 'fu', regex=True)
这里并没有给出你想要的东西——它用普通索引替换了MultiIndex
。
关于python - pandas.DataFrame.replace,对于第一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644794/