假设我有以下.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}}的参数。但它没有给我我想要的东西。
但我仍然认为我可以在这里使用某种正则表达式来做我想做的事情,而无需编写循环或类似的东西。你能帮忙吗?
答案 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')
同一行
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