在Python中将一个列分割成多个列

6
我有一个Python数据框,只有一列内容如下:
index  Train_station

0      Adenauerplatz 52° 29′ 59″ N, 13° 18′ 26″ O
1      Afrikanische Straße 52° 33′ 38″ N, 13° 20′ 3″ O
2      Alexanderplatz 52° 31′ 17″ N, 13° 24′ 48″ O

我希望将其分成3列: 火车站、纬度、经度。数据框应该长这样:

index  Train_station         Latitude       Longitude

0      Adenauerplatz         52° 2959″ N  13° 1826″ O
1      Afrikanische Straße   52° 3338″ N  13° 203″ O
2      Alexanderplatz        52° 3117″ N  13° 2448″ O

我尝试使用df[['Latitude', 'Longitude']] = df.Train_station.str.split(',', expand=True), 但它只将纬度和经度坐标分开。如何分割一个包含我定义的多个条件的列?

我考虑了一种方法,从左边开始检查字符串,当遇到整数或定义的字符串时进行分割,但是我目前还没有找到这种方法的答案。


1
欢迎来到SO。这不是一个讨论论坛或教程。请参观[tour]并花时间阅读[ask]和该页面上找到的其他链接。 - wwii
4个回答

6
df = df.Train_station.str.split(r'(.*?)(\d+°[^,]+),(.*)', expand=True)
print(df.loc[:, 1:3].rename(columns={1:'Train_station', 2:'Latitude', 3:'Longitude'}) )

输出:

          Train_station       Latitude       Longitude
0        Adenauerplatz   52° 29′ 59″ N   13° 18′ 26″ O
1  Afrikanische Straße   52° 33′ 38″ N    13° 20′ 3″ O
2       Alexanderplatz   52° 31′ 17″ N   13° 24′ 48″ O

编辑:感谢@ALollz,您可以使用str.extract()
df = df.Train_station.str.extract(r'(?P<Train_station>.*?)(?P<Latitude>\d+°[^,]+),(?P<Longitude>.*)', expand=True)
print(df)

5
你可以使用.split()方法来分离字符串中的值。
使用.apply()为每个所需的列名创建新的数据框列。
import pandas as pd

data = ["Adenauerplatz 52° 29′ 59″ N, 13° 18′ 26″ O",
        "Afrikanische Straße 52° 33′ 38″ N, 13° 20′ 3″ O",
        "Alexanderplatz 52° 31′ 17″ N, 13° 24′ 48″ O"]

df = pd.DataFrame(data, columns=['Train_station'])


def train_station(x):
    x = x.split(' ', 1)
    return x[0]


def latitude(x):
    x = x.split(' ', 1)
    x = x[1].split(', ', 1)
    return x[0]


def longitude(x):
    x = x.split(' ', 1)
    x = x[1].split(', ', 1)
    return x[1]


df['Latitude'] = df['Train_station'].apply(latitude)
df['Longitude'] = df['Train_station'].apply(longitude)
df['Train_station'] = df['Train_station'].apply(train_station)

print(df)

上面所看到的是对您的原始数据框进行重新创建,并用 .split().apply() 进行修改后的结果。

输出结果:

    Train_station              Latitude      Longitude
0   Adenauerplatz         52° 29′ 59″ N  13° 18′ 26″ O
1    Afrikanische  Straße 52° 33′ 38″ N   13° 20′ 3″ O
2  Alexanderplatz         52° 31′ 17″ N  13° 24′ 48″ O

2
您可以尝试这样做:

您可以尝试以下操作:

df['Latitude']=df['Train_station'].apply(lambda x: ' '.join([i for i in x.split(' ') if any((lett.replace(',','') in '°′″') for lett in i)]).split(',')[0])
df['Longitude']=df['Train_station'].apply(lambda x: ' '.join([i for i in x.split(' ') if any((lett.replace(',','') in '°′″O') for lett in i)]).split(',')[1])
df['Train_station']=df['Train_station'].apply(lambda x: ''.join([i for i in x.split(' ') if not any((lett.replace(',','') in '°′″') for lett in i) ]))

输出:

               Train_station       Latitude       Longitude
0          Adenauerplatz          52° 29′ 59″ N   13° 18′ 26″ O
1    Afrikanische Straße          52° 33′ 38″ N    13° 20′ 3″ O
2         Alexanderplatz          52° 31′ 17″ N   13° 24′ 48″ O

1
类似于 @ Andrej Kesely 所做的事情。
import numpy as np
import pandas as pd

df2=df.Train_station.str.split('(?<=[a-z])(\s)(?![A-Z])|(?<=[A-Z]\,)(\s)|(?<=[A-Z])(\s)', expand=True).replace(' ', np.NaN).dropna(axis='columns')
df2.columns=['Train_station', 'Latitude', 'Longitude']
print(df2)

     Train_station          Latitude      Longitude
0        Adenauerplatz    52° 2959″ N,  13° 1826″ O
1  Afrikanische Straße    52° 3338″ N,   13° 203″ O
2       Alexanderplatz    52° 3117″ N,  13° 2448″ O

解释:

(?<=[a-z])(\s)(?![A-Z])- 在小写字母后面按空格分割,但不跟随大写字母。

或者

(?<=[A-Z]\,)(\s) - 在大写字母后面跟随逗号后按空格分割。

OR

根据大写字母后面的空格。保留HTML代码,不进行解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接