【问题标题】:Iterating through a pandas dataframe and inserting new values into an empty column遍历熊猫数据框并将新值插入空列
【发布时间】:2016-11-02 21:34:06
【问题描述】:

我对 Pandas 比较陌生,并且在遍历我的数据集中给定列中的值并找到包含特定字符串的那些单元格时遇到了麻烦。

Address,City
['1234 Apple Drive', 'San Francisco', 'CA'],''
['4678 Bannana Street', 'Austin', 'TX'],''

对于这个例子,我想 a) 只提取街道信息 b) 包含字符串“Street”的地址,c) 将它们放在新插入的名为“Street”的列中。

Address,City,Street
['1234 Apple Drive', 'San Francisco', 'CA'],'',''
['4678 Bannana Street', 'Austin', 'TX'],'','4678 Bannana Street'

我知道如何在我的数据集中插入一个新列。到目前为止,我的代码如下所示(假设我当前的数据集只有两列和示例中的条目):

import numpy as np
import pandas as pd
from pandas import DataFrame, read_csv

df = pd.read_csv('dataset.csv', sep = '\t')
df.insert(loc=3, column = 'street', value=str)

我所拥有的其余部分并不漂亮,到目前为止一直没用。非常感谢执行 a、b 和 c 的任何帮助!谢谢。

【问题讨论】:

    标签: python pandas dataframe iteration


    【解决方案1】:

    试试这个:

    import re
    
    df = pd.DataFrame([['1234 Apple Drive', 'San Francisco', 'CA'],
                       ['4678 Bannana Street', 'Austin', 'TX']],
                      columns=['Address', 'City', 'State'])
    
    df['Street'] = df.Address.str.extract(r'([\S]+)\s+Street', flags=re.IGNORECASE)
    print df
    
                   Address           City State   Street
    0     1234 Apple Drive  San Francisco    CA      NaN
    1  4678 Bannana Street         Austin    TX  Bannana
    

    如果您还想包含门牌号:

    import re
    
    df[['Street Number', 'Street']] = df.Address.str.extract(r'(\S+)\s+(\S+)\s+Street', expand=True, flags=re.IGNORECASE)
    print df
    
                   Address           City State Street Number   Street
    0     1234 Apple Drive  San Francisco    CA           NaN      NaN
    1  4678 Bannana Street         Austin    TX          4678  Bannana
    
    ​
    

    注意

    使用 pandas 0.18.1 如果我没有指定 expand 标志,我会收到未来的警告。改用这个。

    df['Street'] = df.Address.str.extract(r'([\S]+)\s+Street', expand=False, flags=re.IGNORECASE)
    

    【讨论】:

    • 用我当前的 csv 文件尝试这个,我在提取调用中遇到错误:“extract() 得到了一个意外的关键字参数 'expand'”。有什么想法吗?
    • 版本。我正在使用熊猫 0.18.1。如果我不使用它,我会收到未来的警告。现在试着把它拿出来。更重要的是,我只提取一个值,所以这并不重要。我会更新帖子。
    • 我升级了,可以使用提取就好了。刚刚让它适用于我的本地文件。非常感谢!
    • 如果我想从地址列中提取更多信息并将其放入不同的新列(街道编号,1234),我该怎么做?
    • 更新帖子以适应街道号码。
    【解决方案2】:
    df['street'] = df['Address'].str.replace('\[|\]','').str.split(',', expand=True)[0]
    df['street_filtered'] = df.ix[df.street.str.contains('Street'),'street']
    

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      相关资源
      最近更新 更多