为pandas中每个出现的字符串创建一个新列

时间:2016-12-14 01:45:41

标签: python csv pandas

假设我有以下.txt文件:

Alabama[edit]
fooAL
barAL
Arizona[edit]
fooAz
barAz
bazAz
Alaska[edit]
fooAk
...

如何将其转换为

形式的pandas数据框
| St. Name | Region |
|----------+--------|
| Alabama  | fooAL  |
| Alabama  | barAL  |
| Arizona  | fooAz  |
| Arizona  | barAz  |
| Arizona  | bazAz  |
| Alaska   | fooAk  |
| ...      | ...    |

所以我认为是使用sep= '\[edit\]'之后出现的[edit]字符串作为read_csv pandas中{{1}}的参数。但它没有给我我想要的东西。

但我仍然认为我可以在这里使用某种正则表达式来做我想做的事情,而无需编写循环或类似的东西。你能帮忙吗?

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

我建议不要直接依赖pandas,而是通过打开文件并逐行处理它来构建dict列表来解析,并使用它来创建数据帧:

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)

如果你真的想做大熊猫,我想你可以通过单独处理国家和地区这样做,并使用forward fill NaN(DataFrame.ffill与{{1}相同}(或fillna(method='ffill')

pad