将多个索引展平为一个数据帧头

2024-05-12 23:54:09 发布

您现在位置:Python中文网/ 问答频道 /正文

假设以下数据帧:

     A    B    C    D    E    F
0   d1   10  d11   10  d21   10
1   d2   30  d12   30  d22   30
2   d3   40  d13   40  d23   40
3   d4  105  d14  105  NaN  NaN
4   d5   10  d15   10  NaN  NaN
5   d6   30  NaN  NaN  NaN  NaN
6   d7   40  NaN  NaN  NaN  NaN
7   d8   10  NaN  NaN  NaN  NaN
8   d9    5  NaN  NaN  NaN  NaN
9  d10   10  NaN  NaN  NaN  NaN

如何将所有描述合并到与相应值关联的单个标题中?你知道吗

d1  d2  d3  d4  d5  d6  d7  d8  d9  d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30
0   10  30  40  105 10  30  40  10  5   10  10  30  40  105 10  30  40  10  5   10  10  30  40  105 10  30  40  10  5   10

注意,原始数据帧的某些描述可能有空值和描述(NaN)

我意识到我以前也问过类似的问题,但在把它放到我的代码中之后,它并没有达到我所需要的


Tags: nand2d1d3d6d4d11d12
3条回答
r = np.arange(df.shape[1])
a = r % 2
b = r // 2

df.T.set_index([a, b]).T.stack().set_index(0).T

0  d1 d11 d21  d2 d12 d22  d3 d13 d23   d4  d14  d5 d15  d6  d7  d8 d9 d10
1  10  10  10  30  30  30  40  40  40  105  105  10  10  30  40  10  5  10

为了乐趣:-)你知道吗

pd.DataFrame(sum([df1.values.tolist() for _, df1 in df.groupby((df.dtypes=='object').cumsum(),axis=1)],[])).dropna().set_index(0).T
0  d1    d2    d3     d4    d5    d6    d7    d8   d9   d10   d11   d12  \
1  10.0  30.0  40.0  105.0  10.0  30.0  40.0  10.0  5.0  10.0  10.0  30.0

0  d13    d14   d15   d21   d22   d23  
1  40.0  105.0  10.0  10.0  30.0  40.0  

我们可以在列对上使用pd.concat迭代,即

pairs = list(zip(df.columns,df.columns[1:]))[::2]
# [('A', 'B'), ('C', 'D'), ('E', 'F')]
# iterate over pairs and set the first element of pair as index and rename the column name to 0. Then concat and drop na. 
ndf = pd.concat([df[list(i)].set_index(i[0]).rename(columns={i[1]:0})
                          for i in pairs],0).dropna()
  d1    d2    d3     d4    d5    d6    d7    d8   d9   d10   d11   d12  \
0  10.0  30.0  40.0  105.0  10.0  30.0  40.0  10.0  5.0  10.0  10.0  30.0   

    d13    d14   d15   d21   d22   d23  
0  40.0  105.0  10.0  10.0  30.0  40.0  

相关问题 更多 >