2016-11-17 101 views
1

我对熊猫非常陌生。到目前为止,我一直在使用csv文件和excel电子表格学习熊猫。pandas将undefined文本文件读取到数据帧

现在我面临着将文本文件转换为数据框。文本文件就是我所说的连续数据。该文件的格式是:

State Name 
City Name 
State Name 
City Name 
City Name 
City Name 
... 

所有50个州加上美国领土被列出,但城市数量不尽相同。我需要将其转换成数据帧像

[[State Name, City Name1],[State Name, City Name2],...] 

使用大熊猫read_table()方法,我已经能够至少文件读入到一个数据帧,但现在我不能确定如何让它进入正确的州名城市名称格式。

我也有一个州名/州2字母缩写可用字典。该词典的格式是

{'OH':'OHIO', 'KY':'Kentucky',...} 

有没有一种方法,我可以使用这本字典,遍历文件并分开州和城市?还是有更简单的方法来完成这个?

谢谢

编辑 - 文本文件 文本文件的采样样本如下所示。另外,请不要说我无法修改文件。

Alabama[edit] 
Auburn (Auburn University)[1] 
Florence (University of North Alabama) 
Jacksonville (Jacksonville State University)[2] 
Livingston (University of West Alabama)[2] 
Montevallo (University of Montevallo)[2] 
Troy (Troy University)[2] 
Tuscaloosa (University of Alabama, Stillman College, Shelton State)[3][4] 

Tuskegee (Tuskegee University)[5] 
Alaska[edit] 
Fairbanks (University of Alaska Fairbanks)[2] 
Arizona[edit] 
Flagstaff (Northern Arizona University)[6] 
Tempe (Arizona State University) 
Tucson (University of Arizona) 
+0

@han 。如果有的话,你引用的问题应该被标记为重复。这个问题在那之前被问及并得到了答复。只是说 –

回答

3

假设您的列被称为A。首先找到状态是这样的:

df.A.str.contains('\[edit\]') 
Out[25]: 
0  True 
1  False 
2  False 
3  False 
4  False 
5  False 
6  False 
7  False 
8  False 
9  True 
10 False 
11  True 
12 False 
13 False 
14 False 

使用cumsum定义每个州+城市指数:

csum = df.A.str.contains('\[edit\]').cumsum() 
csum 
Out[26]: 
0  1 
1  1 
2  1 
3  1 
4  1 
5  1 
6  1 
7  1 
8  1 
9  2 
10 2 
11 3 
12 3 
13 3 
14 3 

现在你可以得到国家和城市:

states = df.groupby(csum).first() 
states 
Out[38]: 
       A 
A     
1 Alabama[edit] 
2 Alaska[edit] 
3 Arizona[edit] 

cities = df.groupby(csum).apply(lambda g: g[1:]) 
cities 
Out[39]: 
                 A 
A              
1 1      Auburn (Auburn University)[1] 
    2    Florence (University of North Alabama) 
    3  Jacksonville (Jacksonville State University)[2] 
    4   Livingston (University of West Alabama)[2] 
    5   Montevallo (University of Montevallo)[2] 
    6       Troy (Troy University)[2] 
    7 Tuscaloosa (University of Alabama, Stillman Co... 
    8     Tuskegee (Tuskegee University)[5] 
2 10  Fairbanks (University of Alaska Fairbanks)[2] 
3 12  Flagstaff (Northern Arizona University)[6] 
    13     Tempe (Arizona State University) 
    14      Tucson (University of Arizona) 

现在加入数据帧:

states.join(cities, rsuffix='_cities') 
Out[49]: 
        A           A_cities 
A                  
1 1 Alabama[edit]      Auburn (Auburn University)[1] 
    2 Alabama[edit]    Florence (University of North Alabama) 
    3 Alabama[edit]  Jacksonville (Jacksonville State University)[2] 
    4 Alabama[edit]   Livingston (University of West Alabama)[2] 
    5 Alabama[edit]   Montevallo (University of Montevallo)[2] 
    6 Alabama[edit]       Troy (Troy University)[2] 
    7 Alabama[edit] Tuscaloosa (University of Alabama, Stillman Co... 
    8 Alabama[edit]     Tuskegee (Tuskegee University)[5] 
2 10 Alaska[edit]  Fairbanks (University of Alaska Fairbanks)[2] 
3 12 Arizona[edit]   Flagstaff (Northern Arizona University)[6] 
    13 Arizona[edit]     Tempe (Arizona State University) 
    14 Arizona[edit]      Tucson (University of Arizona) 
+0

这是一个很好的答案。当我发现宾夕法尼亚州有一个名为加利福尼亚的城市时,这帮了我的忙。 –

+0

@PaulStoner你非常欢迎! – Boud

3

我会创造一个cities列表填充(state_name, city_name)元组,然后把元组的这份名单为DataFrame

为此,您需要预编译所有出现在文本文件中的状态列表,以便我们可以识别文件光标何时位于状态行或城市行上。

cities = [] 
list_of_states = ['Alaska', ..., 'Ohio', ...] 

with open('file.csv') as f: 
    for line in f: 
     if line in list_of_states: 
      state = line 
     else: 
      cities.append((state, line)) 

df = pandas.DataFrame(cities) 
+1

@Javin这将工作。谢谢你的帮助 –

+0

@Javin我真诚地为你改变接受的答案而感到歉意。你是一个完全可以接受的答案,很容易实现。事实上,这是你的答案,让我找到一个与国家同名的城市。 –

+0

@PaulStoner没有问题,我upvoted现在接受的答案我自己 – Jivan

相关问题