修改数据帧行 - 熊猫Python

时间:2017-05-10 10:49:03

标签: python pandas dataframe

我希望这还没有发布,我没有找到任何帮助我的东西。所以我有这个数据框df

              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

我很擅长在Python中使用数据框,所以我提供了很多细节,不确定一切是否相关。我尝试使用其他函数,如loc或iloc而不是ix,但仍然得到相同的错误。 任何建议都会非常受欢迎:)

3 个答案:

答案 0 :(得分: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,它会返回更新的数据帧。

(奖励:这篇博文在学习loc,iloc和ix时是一个很好的参考:http://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/

答案 1 :(得分: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])

我希望它可以帮助您解决问题。

答案 2 :(得分:0)

这应该有效:

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

我可能需要查看源代码,看看为什么以下内容不起作用:

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