2016-11-17 29 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