Unstack and map i.e
ndf = df.unstack().to_frame().T
ndf.columns = ndf.columns.map('{0[0]}_{0[1]}'.format)
A_0 A_1 A_2 B_0 B_1 B_2 C_0 C_1 C_2 D_0 D_1 D_2 E_0 E_1 E_2
0 1 6 11 2 7 12 3 8 13 4 9 14 5 10 5
Если вы хотите отсортировать столбцы, вы можете сделать
ndf = df.unstack().to_frame().T.sort_index(1,1)
Вы можете создать функцию: и applymap
для каждой записи в кадре данных:
powers = {'B': 10 ** 9, 'M': 10 ** 6, 'T': 10 ** 12}
# add some more to powers as necessary
def f(s):
try:
power = s[-1]
return int(s[:-1]) * powers[power]
except TypeError:
return s
df.applymap(f)
Демо:
In [58]: df
Out[58]:
col
0 123.456
1 78M
2 0.5B
In [59]: d = {'B': 10**9, 'M': 10**6}
In [60]: df['new'] = \
...: df['col'].str.extract(r'(?P<val>[\d.]+)\s*?(?P<mult>\D*)', expand=True) \
...: .replace('','1') \
...: .replace(d, regex=True) \
...: .astype(float) \
...: .eval('val * mult')
...:
In [61]: df
Out[61]:
col new
0 123.456 1.234560e+02
1 78M 7.800000e+07
2 0.5B 5.000000e+08
Настройка Заимствование @ MaxU's pd.DataFrame
df = pd.DataFrame({'col': ['123.456', '78M', '0.5B']})
Решение Замените строки научным обозначением, затем используйте astype(float)
d = dict(M='E6', B='E9', T='E12')
df.replace(d, regex=True).astype(float)
col
0 1.234560e+02
1 7.800000e+07
2 5.000000e+08