问题概述:
我正在尝试将从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')
答案 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'] ]
解决方案的细目如下:
all_exchanges['MarketCapSymbol'] =
- 在DataFrame上创建一个名为“MarketCapSymbol。”的新列。all_exchanges.loc[:,'MarketCap']
- 将新列中的值初始化为“MarketCap”中的值。re.sub('[$.0-9]', '', i) for i in
- 由于我想要的只是“M”或“B”,因此请对每个元素应用re.sub()
,提取[$.0-9]
并仅保留M|B
。< / LI>
醇>
在我对PANDAS的有限经验中,使用列表理解这种方式对我来说似乎更自然/可读。让我知道你的想法!