如何修改下面的Python代码,以在Pandas字符串的开头添加一个字符?

时间:2018-09-05 14:17:43

标签: python python-3.x pandas dataframe data-processing

我正在执行数据可视化任务,我需要获取数据集并进行某些可视化。考虑有关数据集的以下内容:

  • 这些列由经度表示(列的字符串分别带有“ E”或“ W”,分别表示东经或西经)
  • 这些行由纬度表示(一列以“ N”或“ S”表示北纬或南纬的字符串)

因此,我必须阅读数据集,将带有“ N”的纬度转换为正浮点值,并将带有“ S”的纬度转换为负浮点值(整个数据都在字符串中)。

类似地,我必须将带有'E'的经度转换为正浮点值,并将带有'W'的经度转换为负浮点值。

由于我是Python,Pandas和Numpy的新手,因此实现相同的目标有很多困难。到目前为止,我已经能够将字符串格式的纬度和经度转换为浮点格式,并且分别摆脱了'N','S','E','W'字符。但是,在浮点转换之前,我无法弄清楚如何根据字符(“ N”,“ S”,“ E”,“ W”)使浮点值为正或负。
下面是我到目前为止编写的代码:

import pandas as pd

df = pd.read_csv("Aug-2016-potential-temperature-180x188.txt", skiprows = range(7))
df.columns = ["longitude"]
df = df.longitude.str.split("\t", expand = True)
smaller = df.iloc[::10,:]

print(df.head(10), end = "\n")
print(smaller, end = "\n")
print(df.iloc[1][3], end = "\n")
print(smaller.iloc[2][175], end = "\n")

import numpy as np
import pandas as pd

data = pd.read_csv('~/documents/datasets/viz_a1/Aug-2016-potential-temperature-180x188.txt', skiprows=7)
data.columns = ['longitudes']
data = data['longitudes'].str.split('\t', expand=True)
df = data.iloc[::10,:]
df.head()

# replace 'E' with '' and 'W' with ''
df.loc[0] = df.loc[0].str.replace('E', '').str.replace('W', '')

# convert the longitude values to float values (THIS ONE WORKS)
df.loc[0] = df.loc[0][1:].astype(float)

# replace 'S' with '' and 'N' with ''
df.loc[:][0] = df.loc[:][0].str.replace('S', '').str.replace('N', '')

# convert latitude values into float values (THIS ONE DOES NOT WORK!!)
df.loc[:][0] = df.loc[:][0].astype(float)

# checking if the float values exist
print(df.loc[0][2], ' data-type ', type(df.loc[0][2])) # columns converted into float
print(df.loc[30][0], ' data-type ', type(df.loc[30][0])) # rows not converted into float  

疑问:

  • 如何根据符号将值转换为正浮点值和负浮点值(“ S”,“ W”代表-ve浮点值,而“ E”,“ N”代表正浮点值)
  • 如何成功将纬度转换为浮点值(我编写的代码没有将行转换为浮点数;也没有引发任何错误!)

P.S。经度的转换产生了很多警告。如果有人可以解释为什么我会收到这些警告以及如何防止这些警告,那将会很好。 (再次,我是Python和Pandas的新手!)

可以找到数据集here

这是数据集的屏幕截图:
screenshot of the data just after putting it in data-frame

2 个答案:

答案 0 :(得分:2)

我将在read_csv函数中添加更多参数,以获取一个数据帧,其中的列为纵向字符串,索引为纬度。现在,数据框中的数据就是栅格数据

@if (subSubMenuItem.Items.IsNullOrEmpty())
{
    <a href="@calculateMenuUrl(subSubMenuItem.Url)">
        @if (!string.IsNullOrWhiteSpace(subSubMenuItem.Icon))
        {
            <i class="material-icons">@subSubMenuItem.Icon</i>
        }
        <span>@subSubMenuItem.DisplayName</span>
    </a>
}
else
{
    <a href="javascript:void(0);" class="menu-toggle">
        @if (!string.IsNullOrWhiteSpace(subSubMenuItem.Icon))
        {
            <i class="material-icons">@subSubMenuItem.Icon</i>
        }
        <span>@subSubMenuItem.DisplayName</span>
    </a>
    <ul class="ml-menu">
        @foreach (var subsubSubMenuItem in subSubMenuItem.Items)
        {
            <li class="@(Model.ActiveMenuItemName == subsubSubMenuItem.Name ? "active" : "")">
                <a href="@calculateMenuUrl(subsubSubMenuItem.Url)">
                    @subsubSubMenuItem.DisplayName
                </a>
            </li>
        }
    </ul>
}

然后我将使用以下代码将纵向字符串(数据框的列)转换为浮点数:

df = pd.read_csv(r'Aug-2016-potential-temperature-180x188.txt',
                 skiprows=8, delimiter='\t', index_col=0)

使用以下代码将纬度字符串(数据帧的索引)转换为浮点数后:

column_series = pd.Series(df.columns)
df.columns = column_series.apply(lambda x: float(x.replace('E','')) if x.endswith('E') else -float(x.replace('W','')))

答案 1 :(得分:1)

这可能不是最干净的,但是您可以将“ N”和“ E”替换为“”,然后使用np.where替换“ S”和“ W”,转换为浮点,然后乘以-1 < / p>

我创建了一个df示例,在其中将该过程应用于第一列

example = pd.DataFrame({'1':['S35', 'E24', 'N45', 'W66'],
           '2': ['E45', 'N78', 'S12', 'W22']})

example
Out[153]: 
     1    2
0  S35  E45
1  E24  N78
2  N45  S12
3  W66  W22

col = example.loc[:, '1']

col = col.str.replace('N|E', "")

col
Out[156]: 
0    S35
1     24
2     45
3    W66
Name: 1, dtype: object

example.loc[:,'1'] = np.where(col.str.contains('W|S'), col.str.replace('W|S', '').astype('float') * -1, col)


example
Out[158]: 
    1    2
0 -35  E45
1  24  N78
2  45  S12
3 -66  W22