我有一个1D DataFrame,它以i_n
形式的键索引,其中i
和n
是字符串(在本示例中,i
是字符串一个整数,n
是一个字符)。这将是一个简单的示例:
values
0_a 0.583772
1_a 0.782358
2_a 0.766844
3_a 0.072565
4_a 0.576667
0_b 0.503876
1_b 0.352815
2_b 0.512834
3_b 0.070908
4_b 0.074875
0_c 0.361226
1_c 0.526089
2_c 0.299183
3_c 0.895878
4_c 0.874512
现在,我想将此DataFrame重新排列为2D,以便将数字(下划线前的索引名称部分)用作列名,并将字符(下划线后的索引部分)用作列名。索引:
0 1 2 3 4
a 0.583772 0.782358 0.766844 0.0725654 0.576667
b 0.503876 0.352815 0.512834 0.0709081 0.0748752
c 0.361226 0.526089 0.299183 0.895878 0.874512
我有一个解决问题的方法(下面的功能convert_2d
),但我想知道,是否有一种更惯用的方式来实现这一目标。这里是用于生成原始DataFrame并将其转换为所需形式的代码:
import pandas as pd
import numpy as np
def convert_2d(df):
df2 = pd.DataFrame(columns=['a','b','c'], index=list(range(5))).T
names = set(idx.split('_')[1] for idx in df.index)
numbers = set(idx.split('_')[0] for idx in df.index)
for i in numbers:
for n in names:
df2[i][n] = df['values']['{}_{}'.format(i,n)]
return df2
##generating 1d example data:
data = np.random.rand(15)
indices = ['{}_{}'.format(i,n) for n in ['a','b','c'] for i in range(5)]
df = pd.DataFrame(
data, columns=['values']
).rename(index={i:idx for i,idx in enumerate(indices)})
print(df)
##converting to 2d
print(convert_2d(df))
关于索引键的一些注意事项:可以假设(例如在我的函数中)没有“缺失键”(即始终可以实现2d数组),并且唯一可以认为是密钥是(单个)下划线(即,数字和字母仅是出于解释原因而选择,实际上,下划线仅连接了两个任意字符串)。
答案 0 :(得分:5)
IIUC创建多个索引,然后unstack
df.index=pd.MultiIndex.from_tuples(df.index.str.split('_').map(tuple))
df['values'].unstack(level=0)
Out[65]:
0 1 2 3 4
a 0.583772 0.782358 0.766844 0.072565 0.576667
b 0.503876 0.352815 0.512834 0.070908 0.074875
c 0.361226 0.526089 0.299183 0.895878 0.874512