2016-12-01 82 views
2

問題概述內:整蠱STR值替換大熊貓據幀

我試圖清理從CSV文件導入數據幀的熊貓裝的股票數據。我執行的索引操作有效。如果我撥打print,我可以看到我想要的值正在從框架中拉出。但是,當我嘗試替換值時,如屏幕截圖所示,PANDAS忽略我的請求。最終,我只是試圖從一列中提取一個值並將其移到另一列。 PANDAS文檔建議使用.replace()方法,但這似乎與我嘗試執行的操作無關。

這是圖片的code and data before and after code is run

而for循環(如在PIC中引用):

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

感謝所有發佈者。在考慮瞭解決方案和問題之後,我意識到可能會有不同的方法。我不是使用'n/a'來初始化MarketCapSym列,而是將其創建爲MarketCap的副本,然後提取任何不是「M」或「B」的東西。

我能得到解下來給一個行:

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

解決方案的細目如下:

  1. all_exchanges['MarketCapSymbol'] = - 就稱爲數據幀的新列「MarketCapSymbol。
  2. all_exchanges.loc[:,'MarketCap'] - 將新列中的值初始化爲'MarketCap'中的值。
  3. re.sub('[$.0-9]', '', i) for i in - 因爲我想要的只是'M'或'B',所以在每個元素上應用re.sub(),提取[$.0-9]並僅保留M|B

使用列表理解這種方式似乎有點更自然/可讀,在我有限的PANDAS經驗。讓我知道你的想法!

0

的問題是,j是一個字符串,從而不可改變

您正在替換數據,但不是原始數據集中的數據。

你要做的另一種方式,那麼優雅,沒有zip(我簡化您的測試順便說一句,因爲它也做了同樣的兩個條件):

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') 

現在你替換原始數據集。

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 

這應該是語法的我記得;)

0

Here是缺失值和熊貓相當詳盡的教程。我建議使用fillna()

df['MarketCap'].fillna('M', inplace=True) 
df['MarketCapSym'].fillna('M', inplace=True) 
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)