Вы можете использовать Ordereddict группе данные:
import csv
from collections import OrderedDict,defaultdict
from itertools import islice
with open("out.csv") as f:
od = OrderedDict()
r = csv.reader(f, delimiter=" ")
header = next(r)
years = header[2:]
zipped = zip(*r)
countries = OrderedDict.fromkeys(zipped[0]).keys() # next(zipped) python3
it = iter(countries)
for row in zip(*zipped[1:]): # for row in zip(*zipped) python3
if row[0] == "GDP":
key = next(it)
od.setdefault(key, defaultdict(list))
od[key]["Years"] = years
od[key]["Country"] = [key] * len(years)
od[key][row[0]].extend(islice(row,1,None))
Выход:
OrderedDict([('USA', defaultdict(<type 'list'>, {'GDP': ['10', '11', '12', '12', '13'], 'Inf': ['100', '120', '130', '120', '110'], 'Years': ['1995', '1996', '1997', '1998', '1999'], 'Trade': ['200', '220', '210', '235', '250']})), ('GER', defaultdict(<type 'list'>, {'GDP': ['8', '9', '9.5', '10', '10.5'], 'Inf': ['100', '105', '107', '109', '111'], 'Years': ['1995', '1996', '1997', '1998', '1999'], 'Trade': ['150', '156', '149', '165', '167']}))])
Кто-то более опытный в панд будет иметь возможность получить более хороший способ сделать это не сомневаюсь, но это будет по крайней мере, создать dataframe:
df = pd.DataFrame(columns=["Country","Years","GDP","Inf","Trade"])
for k,v in od.items():
df_temp = pd.DataFrame((v[k] for k in ["Country","Years","GDP","Inf","Trade"]),["Country","Years","GDP","Inf","Trade"]).transpose()
f = df.append(df_temp,ignore_index=True)
print(df)
Выход:
Country Years GDP Inf Trade
0 USA 1995 10 100 200
1 USA 1996 11 120 220
2 USA 1997 12 130 210
3 USA 1998 12 120 235
4 USA 1999 13 110 250
5 GER 1995 8 100 150
6 GER 1996 9 105 156
7 GER 1997 9.5 107 149
8 GER 1998 10 109 165
9 GER 1999 10.5 111 167
Если файл больше, вы также можете создать кадр данных, когда вы идете, и каждый раз перезагружать OrderedDict, чтобы избежать сохраняя все данные в dict также, вам просто нужно добавить последнюю группу вне основного кода, мы также можем использовать itertools.islice, чтобы получить все фрагменты и использовать itertools.izip для zip при использовании python2:
import csv
from collections import OrderedDict,defaultdict
from itertools import islice,izip
df = pd.DataFrame(columns=["Country","Years","GDP","Inf","Trade"])
with open("out.csv") as f:
od = OrderedDict()
r = csv.reader(f, delimiter=" ")
header = next(r)
years = header[2:]
zipped = izip(*r)
countries = OrderedDict.fromkeys(next(zipped)).keys()
it = iter(countries)
for row in izip(*zipped):
if row[0] == "GDP":
if od: # make sure it is not the first line
for k, v in od.items():
df_temp = pd.DataFrame((v[k] for k in ["Country","Years","GDP","Inf","Trade"]), ["Country","Years","GDP","Inf","Trade"]).transpose()
df = df.append(df_temp, ignore_index=True)
od = OrderedDict()
key = next(it)
od.setdefault(key, defaultdict(list))
od[key]["Years"] = years
od[key]["Country"] = [key] * len(years)
od[key][row[0]].extend(islice(row, 1, None))
for k,v in od.items():
df_temp = pd.DataFrame((v[k] for k in ["Country","Years","GDP","Inf","Trade"]), ["Country","Years","GDP","Inf","Trade"]).transpose()
df = df.append(df_temp, ignore_index=True)
print(df)
Который снова должен дать тот же результат:
Country Years GDP Inf Trade
0 USA 1995 10 100 200
1 USA 1996 11 120 220
2 USA 1997 12 130 210
3 USA 1998 12 120 235
4 USA 1999 13 110 250
5 GER 1995 8 100 150
6 GER 1996 9 105 156
7 GER 1997 9.5 107 149
8 GER 1998 10 109 165
9 GER 1999 10.5 111 167
Иметь хороший день! –
@mescalinum спасибо за ваше время – homayoun