PANDAS DataFrame中的Tricky str值替换

时间:2016-12-01 20:18:21

标签: python string pandas dataframe replace

问题概述

我正在尝试将从CSV文件加载的库存数据清理为Pandas DataFrame。我执行的索引操作有效。如果我拨打print,我可以看到我想要的值是从帧中提取的。但是,当我尝试替换值时,如屏幕截图所示,PANDAS忽略了我的请求。最后,我只想从一列中提取一个值并将其移到另一列。 PANDAS文档建议使用.replace()方法,但这似乎与我正在尝试执行的操作无关。

这是code and data before and after code is run的图片。

for循环(如图中所示):

for i, j in zip(all_exchanges['MarketCap'], all_exchanges['MarketCapSym']):
    if 'M' in i: j = j.replace('n/a','M') 
    elif 'B' in i: j = j.replace('n/a','M')

5 个答案:

答案 0 :(得分:0)

问题是j是一个字符串,因此不可变

您正在替换数据,但不会替换原始数据集。

你必须采用另一种方式,不那么优雅,没有zip(我简化了你的测试BTW,因为它在两种条件下都做了同样的事情):

aem = all_exchanges['MarketCap']
aems = all_exchanges['MarketCapSym']

for i in range(min(len(aem),len(aems)): # like zip: shortest of both
     if 'M' in aem[i] or 'B' in aem[i]:
         aems[i] = aems[i].replace('n/a','M') 

现在您正在替换原始数据集。

答案 1 :(得分:0)

如果两列都在同一数据帧中,则all_exchanges遍历行。

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

这应该是我记得的语法;)

答案 2 :(得分:0)

Here是关于缺失值和熊猫的非常详尽的教程。我建议使用fillna()

df['MarketCap'].fillna('M', inplace=True)
df['MarketCapSym'].fillna('M', inplace=True)

答案 3 :(得分:0)

如果可以,请避免迭代。正如已经指出的那样,您不会修改原始数据。 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)

答案 4 :(得分:0)

感谢所有发帖的人。在考虑了解决方案和问题的时间之后,我意识到可能会有不同的方法。我没有使用MarketCapSym初始化'n/a'列,而是将该列创建为MarketCap的副本,然后提取不是“M”或“B”的任何内容。

我能够将解决方案缩小到一行:

all_exchanges['MarketCapSymbol'] = [ re.sub('[$.0-9]', '', i) for i in all_exchanges.loc[:,'MarketCap'] ]

解决方案的细目如下:

  1. all_exchanges['MarketCapSymbol'] = - 在DataFrame上创建一个名为“MarketCapSymbol。”的新列。
  2. all_exchanges.loc[:,'MarketCap'] - 将新列中的值初始化为“MarketCap”中的值。
  3. re.sub('[$.0-9]', '', i) for i in - 由于我想要的只是“M”或“B”,因此请对每个元素应用re.sub(),提取[$.0-9]并仅保留M|B。< / LI>

    在我对PANDAS的有限经验中,使用列表理解这种方式对我来说似乎更自然/可读。让我知道你的想法!