1
Alabama[edit]
Auburn (Auburn University)[1]
Florence (University of North Alabama)
Jacksonville (Jacksonville State University)[2]
Alaska[edit]
Fairbanks (University of Alaska Fairbanks)[2]
Arizona[edit]
Flagstaff (Northern Arizona University)[6]
Tempe (Arizona State University)
Tucson (University of Arizona)

これは私のテキストです。州名用の 1 列と町名用の別の列を持つデータ フレームを作成する必要があります。大学名を削除する方法を知っています。しかし、[編集] ごとに新しい状態であることをパンダに伝えるにはどうすればよいでしょうか。

期待される出力データフレーム

Alabama Auburn
Alabama Florence 
Alabama Jacksonville
Alaska  Fairbanks 
Arizona Flagstaff
Arizona Tempe
Arizona Tucson  

read_table を使用できるかどうかわかりません。すべてをデータフレームにインポートしましたが、州と都市は同じ列にあります。また、リストを試してみましたが、問題は同じです。

行に [edit] がある場合、その後と次の [edit] 行の前のすべての値がその間の行の状態になるように機能するものが必要です

4

2 に答える 2

4

Pandas を使用すると、次のことができます。

import pandas as pd
df = pd.read_table('data', sep='\n', header=None, names=['town'])
df['is_state'] = df['town'].str.contains(r'\[edit\]')
df['groupno'] = df['is_state'].cumsum()
df['index'] = df.groupby('groupno').cumcount()
df['state'] = df.groupby('groupno')['town'].transform('first')
df['state'] = df['state'].str.replace(r'\[edit\]', '')
df['town'] = df['town'].str.replace(r' \(.+$', '')
df = df.loc[~df['is_state']]
df = df[['state','town']]

利回り

     state          town
1  Alabama        Auburn
2  Alabama      Florence
3  Alabama  Jacksonville
5   Alaska     Fairbanks
7  Arizona     Flagstaff
8  Arizona         Tempe
9  Arizona        Tucson

コードが何をしているかの内訳は次のとおりです。テキスト ファイルを DataFrame に読み込んだ後、str.contains状態である行を識別するために使用します。cumsumTrue/False 値の累積合計を取得するために使用します。True は 1 として扱われ、False は 0 として扱われます。

df = pd.read_table('data', sep='\n', header=None, names=['town'])
df['is_state'] = df['town'].str.contains(r'\[edit\]')
df['groupno'] = df['is_state'].cumsum()
#                                               town is_state  groupno
# 0                                    Alabama[edit]     True        1
# 1                    Auburn (Auburn University)[1]    False        1
# 2           Florence (University of North Alabama)    False        1
# 3  Jacksonville (Jacksonville State University)[2]    False        1
# 4                                     Alaska[edit]     True        2
# 5    Fairbanks (University of Alaska Fairbanks)[2]    False        2
# 6                                    Arizona[edit]     True        3
# 7       Flagstaff (Northern Arizona University)[6]    False        3
# 8                 Tempe (Arizona State University)    False        3
# 9                   Tucson (University of Arizona)    False        3

これで、groupno数値ごとに、グループ内の各行に一意の整数を割り当てることができます。

df['index'] = df.groupby('groupno').cumcount()
#                                               town is_state  groupno  index
# 0                                    Alabama[edit]     True        1      0
# 1                    Auburn (Auburn University)[1]    False        1      1
# 2           Florence (University of North Alabama)    False        1      2
# 3  Jacksonville (Jacksonville State University)[2]    False        1      3
# 4                                     Alaska[edit]     True        2      0
# 5    Fairbanks (University of Alaska Fairbanks)[2]    False        2      1
# 6                                    Arizona[edit]     True        3      0
# 7       Flagstaff (Northern Arizona University)[6]    False        3      1
# 8                 Tempe (Arizona State University)    False        3      2
# 9                   Tucson (University of Arizona)    False        3      3

ここでも各groupno番号について、各グループの最初の町を選択することで州を見つけることができます。

df['state'] = df.groupby('groupno')['town'].transform('first')
#                                               town is_state  groupno  index          state
# 0                                    Alabama[edit]     True        1      0  Alabama[edit]
# 1                    Auburn (Auburn University)[1]    False        1      1  Alabama[edit]
# 2           Florence (University of North Alabama)    False        1      2  Alabama[edit]
# 3  Jacksonville (Jacksonville State University)[2]    False        1      3  Alabama[edit]
# 4                                     Alaska[edit]     True        2      0   Alaska[edit]
# 5    Fairbanks (University of Alaska Fairbanks)[2]    False        2      1   Alaska[edit]
# 6                                    Arizona[edit]     True        3      0  Arizona[edit]
# 7       Flagstaff (Northern Arizona University)[6]    False        3      1  Arizona[edit]
# 8                 Tempe (Arizona State University)    False        3      2  Arizona[edit]
# 9                   Tucson (University of Arizona)    False        3      3  Arizona[edit]

基本的に、目的の DataFrame があります。あとは結果をきれいにするだけです。を使用して s からを削除[edit]し、states から最初のかっこの後のすべてを削除できます。townstr.replace

df['state'] = df['state'].str.replace(r'\[edit\]', '')
df['town'] = df['town'].str.replace(r' \(.+$', '')

townが実際に状態である行を削除します。

df = df.loc[~df['is_state']]

最後に、目的の列のみを保持します。

df = df[['state','town']]
于 2016-11-04T01:13:52.797 に答える
3

できるかもしれpandasませんが、簡単にできます。

data = '''Alabama[edit]
Auburn (Auburn University)[1]
Florence (University of North Alabama)
Jacksonville (Jacksonville State University)[2]
Alaska[edit]
Fairbanks (University of Alaska Fairbanks)[2]
Arizona[edit]
Flagstaff (Northern Arizona University)[6]
Tempe (Arizona State University)
Tucson (University of Arizona)'''

# ---

result = []

state = None

for line in data.split('\n'):

    if line.endswith('[edit]'):
        # remember new state
        state = line[:-6] # without `[edit]`
    else:
        # add state, city to result
        city, rest = line.split(' ', 1)
        result.append( [state, city] )

# --- display ---

for state, city in result:
    print(state, city)

ファイルから読み取る場合

result = []

state = None

with open('your_file') as f:
    for line in f:
        line = line.strip() # remove '\n'

        if line.endswith('[edit]'):
            # remember new state
            state = line[:-6] # without `[edit]`
        else:
            # add state, city to result
            city, rest = line.split(' ', 1)
            result.append( [state, city] )

# --- display ---

for state, city in result:
    print(state, city)

resultを使用して作成できるようになりましDataFrameた。

于 2016-11-04T00:44:24.960 に答える