2017-05-10 181 views
1

我希望這還沒有發佈,我還沒有找到任何幫助我的東西。所以,我有DF修改dataframe行 - 熊貓Python

   Id Numero     Voie CodePostal   Commune \ 
1 940010005V-59  59   Rue d'Ablon  94480 Ablon-sur-Seine 
2 940010005V-61  61   Rue d'Ablon  94480 Ablon-sur-Seine 
3 940010005V-65  65   Rue d'Ablon  94480 Ablon-sur-Seine 

    Source Latitude Longitude \ 
1 C+O 48.721350 2.414291 
2 C+O 48.722434 2.413538 
3 OSM 48.721141 2.415030 
              Adresse AdresseGPS LatitudeGPS \ 
1   59 Rue d'Ablon, Ablon-sur-Seine, France      0.0 
2   61 Rue d'Ablon, Ablon-sur-Seine, France      0.0 
3   65 Rue d'Ablon, Ablon-sur-Seine, France      0.0 

    LongitudeGPS 
1   0.0 
2   0.0 
3   0.0 

我進口它從一個CSV文件,並添加使用

df = df.assign(AdresseGPS="",LatitudeGPS = 0.,LongitudeGPS = 0.) 

我想要做的使用功能

被修改,這些最後三個欄什麼的最後三列該數據幀
def funcRow(dataIn): 
    dataOut = dataIn 
    dataOut['AdresseGPS'] = 't' 
    dataOut['LatitudeGPS'] = 1 
    return(dataOut) 

然而,當我做

df.ix[1,] = funcRow(df.ix[1,]) 

我收到以下錯誤:IndexError:元組索引超出範圍

我印這兩個

df.ix[1,] & funcRow(df.ix[1,]) 

我得到如下:

print df.ix[1,] 
    Id          940010005V-59 
    Numero            59 
    Voie          Rue d'Ablon 
    CodePostal          94480 
    Commune         Ablon-sur-Seine 
    Source            C+O 
    Latitude          48.7214 
    Longitude          2.41429 
    Adresse   59 Rue d'Ablon, Ablon-sur-Seine, France 
    AdresseGPS            
    LatitudeGPS           0 
    LongitudeGPS           0 
    Name: 1, dtype: object 

print funcRow 
    Id          940010005V-59 
    Numero            59 
    Voie          Rue d'Ablon 
    CodePostal          94480 
    Commune         Ablon-sur-Seine 
    Source            C+O 
    Latitude          48.7214 
    Longitude          2.41429 
    Adresse   59 Rue d'Ablon, Ablon-sur-Seine, France 
    AdresseGPS           t 
    LatitudeGPS           1 
    LongitudeGPS           0 
    Name: 1, dtype: object 

我很新的使用的數據幀,所以我提供了很多細節,不確定是否一切都相關。我嘗試過使用其他函數,如loc或iloc而不是ix,但仍然得到相同的錯誤。 任何意見將是非常歡迎的。

回答

1

我認爲解決這個問題的「最安全」方式是用.loc []代替.ix []。

試試這個:

def funcRow(dataIn): 
    dataOut = dataIn 
    dataOut['AdresseGPS'] = 't' 
    dataOut['LatitudeGPS'] = 1 
    return(dataOut) 

df.loc[1,:] = funcRow(df.loc[1,:]) 

(如果你不習慣的.loc []:第一個參數是行選擇,第二個參數是列選擇,並給予「:」手段你選擇全部)。

當我運行上面的代碼時,我收到一條警告消息,但是如果我打印df,它會返回更新的數據幀。

(獎金:學習祿,ILOC和九時,此博客文章是一個很好的參考:http://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/

+0

我也收到了警告,但它的工作原理!非常感謝解決方案和博客文章!這將是有益的! – arnino

+0

我很高興它的工作原理!請點擊旁邊的我的答覆退房選項標記您的問題如回答:) –

0

根據該文件,

.IX []支持混合整數和標籤的訪問。它主要是基於標籤的,但是會回退到整數位置訪問,除非相應的軸是整數類型。

我想你想訪問整個數據幀值的最後三列。

如果它是你可以試試,

df.ix[:] = funcRow(df.ix[:]) #for whole rows 

df.ix[start:end]=funcRow(df.ix[start:end]) #for specific rows 

,或者如果你想只訪問特定的行,那麼你可以使用這個,

df.ix[n] = funcRow(df.ix[n]) 

希望它可能會幫助你解決你的問題。

0

這應該工作:

df.ix[1] = funcRow(df.ix[1,]) 

我可能需要看看源代碼看看爲什麼以下不起作用:

df.ix[1,] = funcRow(df.ix[1,]) 
+0

不要使用'ix' - [檢查文檔(http://pandas.pydata.org/pandas-docs/stable/whatsnew.html# whatsnew-0200-API的磨合棄用-IX) – jezrael