【问题标题】:Suggestions for tricky string in pandas rowpandas row中棘手字符串的建议
【发布时间】:2020-06-08 21:43:01
【问题描述】:

我正在处理天气数据,并且仍在学习如何有效地使用 pandas...我有一个 pandas 数据集,其中有一排风速和风向已格式化。问题是方向的字符串格式。当前风速风向列df['WindDirSpeed']的格式如下:

            IssueDatetime                                Regions  \
0     2018-01-01 06:00:00                            SOUTH COAST   
1     2018-01-01 06:00:00                            SOUTH COAST   
2     2018-01-01 06:00:00                            SOUTH COAST   
3     2018-01-01 06:00:00                            SOUTH COAST   
4     2018-01-01 06:00:00  EAST COAST-CAPE ST  FRANCIS AND SOUTH   
...                   ...                                    ...   
12833 2018-12-30 06:00:00               SOUTHEASTERN GRAND BANKS   
12834 2018-12-30 06:00:00               SOUTHEASTERN GRAND BANKS   
12835 2018-12-30 06:00:00               SOUTHEASTERN GRAND BANKS   
12836 2018-12-30 06:00:00               SOUTHWESTERN GRAND BANKS   
12837 2018-12-30 06:00:00               SOUTHWESTERN GRAND BANKS   

             forecastTime  forecastHour WindDirSpeed  
0     2018-01-01 06:00:00           0.0         SW35  
1     2018-01-01 15:00:00           9.0         SW25  
2     2018-01-02 08:00:00          26.0      SW15-20  
3     2018-01-02 15:00:00          33.0     VRB10-15  
4     2018-01-01 06:00:00           0.0         SW35  
...                   ...           ...          ...  
12833 2018-12-30 06:00:00           0.0         W25   
12834 2018-12-30 09:00:00           3.0          W25  
12835 2018-12-30 18:00:00          12.0         NW35  
12836 2018-12-30 06:00:00           0.0          W25  
12837 2018-12-30 12:00:00           6.0         NW30

我试图编写一个函数来提取方向并创建一个仅具有风向的新行:

def find_windDir(row):
    directions = ['VRB', 'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']
    for d in directions:
        if d in row['WindDirSpeed']:
            row['dir'] = d
            row['WindSpeed'] = row['WindDirSpeed'].replace(d,'')
    return row

不幸的是,这不起作用,因为“行内”会找到方向字符串的所有变体。

理想情况下,我需要在单独的列中将数据集与风速和风向分开:

 Dir WindSpeed  
  SW     35  
  SW     25  
  SW   15-20  

【问题讨论】:

  • 简单的解决方法应该是按长度(最长在前)对“方向”中的字符串进行排序。
  • df['WindDirSpeed'].str.split('([VNEWS][REW]?[B]?)', expand=True) 应该可以工作

标签: python python-3.x pandas


【解决方案1】:

试试这个:

df['Dir'] = df['WindDirSpeed'].str.extract(r'([A-Z]*)')
df['WindSpeed'] = df['WindDirSpeed'].str.extract(r'([0-9]+\-[0-9]+|[0-9]+)')
print(df)

输出:

           forecastTime  forecastHour WindDirSpeed  Dir WindSpeed
2018-01-01     06:00:00           0.0         SW35   SW        35
2018-01-01     15:00:00           9.0         SW25   SW        25
2018-01-02     08:00:00          26.0      SW15-20   SW     15-20
2018-01-02     15:00:00          33.0     VRB10-15  VRB     10-15
2018-01-01     06:00:00           0.0         SW35   SW        35
2018-12-30     06:00:00           0.0          W25    W        25
2018-12-30     09:00:00           3.0          W25    W        25
2018-12-30     18:00:00          12.0         NW35   NW        35
2018-12-30     06:00:00           0.0          W25    W        25
2018-12-30     12:00:00           6.0         NW30   NW        30

【讨论】:

  • 是的,刚刚意识到我需要extract 而不是split。我使用的正则表达式是Dir: '([VNEWS][REW]?[B]?)',而WindSpeed'[VNEWS][REW]?[B]?(.*)'
  • 第一个工作正常,第二个不工作
  • 奇怪,你得到了什么错误?它应该是一样的——只是在那种情况下,捕获组是“任意数量的任意字符模式之后”
  • 对不起,他们都工作:df['Dir'] = df['WindDirSpeed'].str.extract(r'([VNEWS][REW]?[B]?)')df['WindSpeed'] = df['WindDirSpeed'].str.extract(r'[VNEWS][REW]?[B]?(.*)')
猜你喜欢
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
相关资源
最近更新 更多