Python 熊猫数据帧中棘手的str值替换
问题概述: 我正在尝试清理从CSV文件加载到Pandas数据框中的股票数据。我执行的索引操作很有效。如果我调用Python 熊猫数据帧中棘手的str值替换,python,string,pandas,dataframe,replace,Python,String,Pandas,Dataframe,Replace,问题概述: 我正在尝试清理从CSV文件加载到Pandas数据框中的股票数据。我执行的索引操作很有效。如果我调用print,我可以看到所需的值正在从帧中提取。但是,当我尝试替换这些值时,如屏幕截图所示,PANDAS会忽略我的请求。最后,我只是试图从一列中提取一个值,并将其移动到另一列。PANDAS文档建议使用.replace()方法,但这似乎不适用于我尝试执行的操作 这是一张照片 和for循环(如图中所示): 问题是j是一个字符串,因此是不可变的 您正在替换数据,但不是在原始数据集中 你必须用另一
print
,我可以看到所需的值正在从帧中提取。但是,当我尝试替换这些值时,如屏幕截图所示,PANDAS会忽略我的请求。最后,我只是试图从一列中提取一个值,并将其移动到另一列。PANDAS文档建议使用.replace()
方法,但这似乎不适用于我尝试执行的操作
这是一张照片
和for循环(如图中所示):
问题是
j
是一个字符串,因此是不可变的
您正在替换数据,但不是在原始数据集中
你必须用另一种方式来做,不那么优雅,没有zip
(顺便说一句,我简化了你的测试,因为它在两种情况下都做了相同的测试):
现在您正在替换原始数据集中的数据。如果两列都在同一数据帧中,则所有的交换都会在行上迭代
for i, row in enumerate ( all_exchanges ):
# get whatever you want from row
# using the index you should be able to set a value
all_exchanges.loc[i, 'columnname'] = xyz
这应该是我记得的语法;) 是关于缺失值和熊猫的非常详尽的教程。我建议使用:
尽可能避免迭代。如前所述,您并没有修改原始数据。在
MarketCap
列上编制索引,并按照以下步骤执行替换
# overwrites any data in the MarketCapSym column
all_exchanges.loc[(all_exchanges['MarketCap'].str.contains('M|B'),
'MarketCapSym'] = 'M'
# only replaces 'n/a'
all_exchanges.loc[(all_exchanges['MarketCap'].str.contains('M|B'),
'MarketCapSym'].replace({'n/a', 'M'}, inplace=True)
感谢所有发帖的人。在考虑了你的解决方案和问题一段时间后,我意识到可能会有一种不同的方法。我没有用
'n/a'
初始化MarketCapSym
列,而是将该列创建为MarketCap
的副本,然后提取任何不是“M”或“B”的内容
我能够将解决方案归结为一行:
all_exchanges['MarketCapSymbol']=[re.sub('[$.0-9]','',i)for i in all_exchanges.loc[:,'MarketCap']
解决方案的细分如下:
所有交换['MarketCapSymbol']=
-在数据框上创建一个名为'MarketCapSymbol'的新列all_exchanges.loc[:,'MarketCap']
-将新列中的值初始化为'MarketCap'中的值re.sub('[$.0-9]','',i)表示
中的i-因为我只需要'M'或'B',所以在每个元素上应用re.sub()
,提取[$.0-9]
,只留下M | B
for i, row in enumerate ( all_exchanges ):
# get whatever you want from row
# using the index you should be able to set a value
all_exchanges.loc[i, 'columnname'] = xyz
df['MarketCap'].fillna('M', inplace=True)
df['MarketCapSym'].fillna('M', inplace=True)
# overwrites any data in the MarketCapSym column
all_exchanges.loc[(all_exchanges['MarketCap'].str.contains('M|B'),
'MarketCapSym'] = 'M'
# only replaces 'n/a'
all_exchanges.loc[(all_exchanges['MarketCap'].str.contains('M|B'),
'MarketCapSym'].replace({'n/a', 'M'}, inplace=True)