如何更改熊猫DataFrame的列值?

时间:2020-07-30 20:08:18

标签: python pandas dataframe csv google-colaboratory

我正在使用Pandas中的以下数据。对于街区列,我需要更改每个值,使其仅包含街道名称(这样我就可以对纬度长的坐标进行地理编码)。要使用我正在使用的地址解析器,还需要添加“华盛顿特区”。

crimes = pd.read_csv("/content/SearchResults (2).txt", encoding='latin-1') enter image description here

这不是我的BLOCK列的样子:

2ND STREET SE, WASHINGTON DC

TAYLOR STREET NE, WASHINGTON DC

我该怎么做?如果更容易,我可以使用此信息添加另一列,而不用更改块列。显然您不能在pd数据帧上使用字符串方法,而对于正则表达式我一无所知……请帮助!

编辑:

此代码正是我想要的:

for i in crimes['BLOCK']:
  i = i.split()
  i = i[-3:]
  i = " ".join([str(elem) for elem in i])
  i = i + ", WASHINGTON DC "
  print(i)

输出看起来像这样:

MINNESOTA AVENUE NE, WASHINGTON DC 
MORSE STREET NE, WASHINGTON DC 

如何将实际的列值重新分配给上面的i变量?

编辑2:

以下是csv文件的示例:

REPORT_DAT,OFFENSE,METHOD,BLOCK,DISTRICT,WARD,NEIGHBORHOOD_CLUSTER,BLOCK_GROUP,XBLOCK,YBLOCK,START_DATE
6/30/2020 3:03:21 AM,THEFT F/AUTO,OTHERS,5700  - 5799 BLOCK OF 27TH STREET NW,2,4,Cluster 10,001500 1,395132,144513,6/29/2020 2:00:48 PM
6/30/2020 12:04:33 AM,MOTOR VEHICLE THEFT,OTHERS,4432 - 4499 BLOCK OF GREENWICH PARKWAY NW,2,3,Cluster 13,000802 2,392727,138206,6/29/2020 1:00:43 PM 

1 个答案:

答案 0 :(得分:2)

我不知道您尝试了什么,但是使用pandas内置的字符串方法没有问题

df['BLOCK'] = df['BLOCK'].str.split('OF').str[1] + ', WASHINGTON DC'

最小工作代码

text ='''REPORT_DAT,SHIFT,OFFENSE,METHOD,BLOCK
6/30/2020 3:03:21 AM,MIDNIGHT,THEFT F/AUTO,OTHERS,5700 - 5799 BLOCK OF 27TH STREET NW
6/30/2020 12:04:33 AM,MIDNIGHT,MOTOR VEHICLE THEFT,OTHERS,4432 - 4499 BLOCK OF GREENWICH PARKWAY NW'''

import pandas as pd
import io

df = pd.read_csv(io.StringIO(text))

print('--- before ---')
print(df['BLOCK'])

df['BLOCK'] = df['BLOCK'].str.split('OF').str[1] + ', WASHINGTON DC'

print('--- after ---')
print(df['BLOCK'])

结果

--- before ---
0          5700 - 5799 BLOCK OF 27TH STREET NW
1    4432 - 4499 BLOCK OF GREENWICH PARKWAY NW
Name: BLOCK, dtype: object

--- after ---
0           27TH STREET NW, WASHINGTON DC
1     GREENWICH PARKWAY NW, WASHINGTON DC
Name: BLOCK, dtype: object

顺便说一句: pandas使用了自己的字符串函数,而这些字符串函数是普通字符串函数中找不到的-.str.contains()。其中一些可以重建-即。 .str.replace()可以使用正则表达式。


顺便说一句::您还可以使用.apply(),然后使用标准字符串函数

df['BLOCK'] = df['BLOCK'].apply(lambda text: text.split('OF')[1] + ', WASHINGTON DC')

def convert(text):
    return text.split('OF')[1] + ', WASHINGTON DC'
    
df['BLOCK'] = df['BLOCK'].apply(convert)

然后可以在convert()中使用更复杂的代码-即。您可以轻松使用if/else