2016-12-14 6 views
1

内の文字列の各出現のために新しい列を作成します。私は、次の.txtファイルがあるとします。パンダ

私は、フォーム

| St. Name | Region | 
|----------+--------| 
| Alabama | fooAL | 
| Alabama | barAL | 
| Arizona | fooAz | 
| Arizona | barAz | 
| Arizona | bazAz | 
| Alaska | fooAk | 
| ...  | ... | 
のパンダのデータフレームにこれを変換することができますどのよう
Alabama[edit] 
fooAL 
barAL 
Arizona[edit] 
fooAz 
barAz 
bazAz 
Alaska[edit] 
fooAk 
... 

だから私は、の各状態名の後に表示される[編集]文字列をread_csvpandasに使用していたと思った。しかし、それは私が欲しいものを私に与えません。

しかし、私はここでも何らかの正規表現を使用して、ループなどの文章を書くことなく私がしたいことをすることができると思います。あなたは助けてもらえますか?

+0

そして、それは、([Pythonでのデータサイエンス入門の週4]のように多くのことを見てんHTTPS ://www.coursera.org/learn/python-data-analysis)にあります。 –

+0

はい。彼らはあなたがstackoverflowに関する質問をすることをお勧めします。だから私はやった:) – minibuffer

答えて

1

私はここで直接パンダに頼るが、データフレームを作成するために辞書のリストを作成し、それを使用するために行ずつファイルを開くと、それを扱うことにより、解析にはないことをお勧め:

with open('yourfile.txt','r') as f: 
    content = f.read().splitlines() 

state = None 
l_dict = [] 
for line in content: 
    if '[edit]' in line: 
     state = line.split('[')[0] 
    else: 
     l_dict.append({'St. Name':state, 'Region':line}) 

df = pd.DataFrame(l_dict) 
df.set_index('St. Name', inplace=True) 

あなたが本当にパンダでやりたい場合は、私はあなたが個別に州や地域を扱うことで、このようにそれを行うことができると思いますし、NaNののforward fillを使用して(DataFrame.ffillfillna(method='ffill')(またはpadと同じである)

行で
3
# header is None and names=['St. Name'] 
s = pd.read_csv('yourfile.txt', header=None, squeeze=True, names=['St. Name']) 

# grab [edit] lines 
st = s.str.extract('(.*)\[edit\]').ffill() 
# groupby 
g = s.groupby(st) 
# use tail(-1) to get all but first row 
df = g.apply(pd.Series.tail, n=-1) 
# reset_index to get what we want 
df.reset_index('St. Name', name='Region') 

enter image description here


同じこと

s = pd.read_csv(StringIO(txt), header=None, squeeze=True, names=['St. Name']) 

s.groupby(s.str.extract('(.*)\[edit\]').ffill()) \ 
    .apply(pd.Series.tail, n=-1) \ 
    .reset_index('St. Name', name='Region') 
+0

Me likey!非常にエレガント。 –