Python 熊猫数据帧中棘手的str值替换

Python 熊猫数据帧中棘手的str值替换,python,string,pandas,dataframe,replace,Python,String,Pandas,Dataframe,Replace,问题概述: 我正在尝试清理从CSV文件加载到Pandas数据框中的股票数据。我执行的索引操作很有效。如果我调用print,我可以看到所需的值正在从帧中提取。但是,当我尝试替换这些值时,如屏幕截图所示,PANDAS会忽略我的请求。最后,我只是试图从一列中提取一个值,并将其移动到另一列。PANDAS文档建议使用.replace()方法,但这似乎不适用于我尝试执行的操作 这是一张照片 和for循环(如图中所示): 问题是j是一个字符串,因此是不可变的 您正在替换数据,但不是在原始数据集中 你必须用另一

问题概述

我正在尝试清理从CSV文件加载到Pandas数据框中的股票数据。我执行的索引操作很有效。如果我调用
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)