2017-05-10 182 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