一种优雅的方式,可以更快地转换 pandas 中的转置之类的东西
An elegant way to make transformation of something like transpose in pandas faster
我有一个pandas.Dataframe
叫a
,结构如下:
虽然我想得到 DataFrame
结构是这样的:
其中 b
类似于 a
的转置。
通过将 a
转换为 b
,我使用代码:
id_uni = a['id'].unique()
b = pd.DataFrame(columns=['id']+[str(i) for i in range(1,4)])
b['id'] = id_uni
for i in id_uni:
for j in range(7):
ind = (a['id'] == i) & (a['w'] == j)
med = a.loc[ind, 't'].values
if med:
b.loc[b['id'] == i, str(j)] = med[0]
else:
b.loc[b['id'] == i, str(j)] = 0
这个方法很残酷,我只用了两个for循环就得到了从a
到b
的所有元素。而且速度很慢。你有有效的改进方法吗?
您可以使用 pivot
:
print (df.pivot(index='id', columns='w', values='t'))
w 1 2 3
id
0 54 147 12
1 1 0 1
df1 = df.pivot(index='id', columns='w', values='t').reset_index()
df1.columns.name=None
print (df1)
id 1 2 3
0 0 54 147 12
1 1 1 0 1
我有一个pandas.Dataframe
叫a
,结构如下:
虽然我想得到 DataFrame
结构是这样的:
其中 b
类似于 a
的转置。
通过将 a
转换为 b
,我使用代码:
id_uni = a['id'].unique()
b = pd.DataFrame(columns=['id']+[str(i) for i in range(1,4)])
b['id'] = id_uni
for i in id_uni:
for j in range(7):
ind = (a['id'] == i) & (a['w'] == j)
med = a.loc[ind, 't'].values
if med:
b.loc[b['id'] == i, str(j)] = med[0]
else:
b.loc[b['id'] == i, str(j)] = 0
这个方法很残酷,我只用了两个for循环就得到了从a
到b
的所有元素。而且速度很慢。你有有效的改进方法吗?
您可以使用 pivot
:
print (df.pivot(index='id', columns='w', values='t'))
w 1 2 3
id
0 54 147 12
1 1 0 1
df1 = df.pivot(index='id', columns='w', values='t').reset_index()
df1.columns.name=None
print (df1)
id 1 2 3
0 0 54 147 12
1 1 1 0 1