Skip to main content
 首页 » 编程设计

python之如何使用 Pandas 将水平数据帧结构转换为垂直结构

2025年05月04日14rubylouvre

你好,我有一个类似的问题one但反过来。我需要知道如何使用第一列 id 作为键垂直写入数据框。

首先,我的输入数据框示例如下所示:

>>> df = pd.DataFrame({'id':[1,2,3,4,5], 'tag': ['a','b','c','d','e'], 'tag2': ['f','g','h','i','j'], 'tag3': ['k','l','m','','']}) 
>>> df 
   id tag tag2 tag3 
0   1   a    f    k 
1   2   b    g    l 
2   3   c    h    m 
3   4   d    i 
4   5   e    j 

我想要的输出应该是这样的:

>>> df 
    id tag 
0    1   a 
1    1   f 
2    1   k 
3    2   b 
4    2   g 
5    2   l 
6    3   c 
7    3   h 
8    3   m 
9    4   d 
10   4   i 
11   5   e 
12   5   j 

看起来我必须使用 id 列的条目作为我字典的键,对吧?像一个 default_dict(list):

{1:['a','k','l'], 2:['b','g','l'], 3:['c','h','m'], 4:['d','i'], 5:['e','j']} 

我只是无法将每行的所有列值作为列表放入字典中,我已经知道如果只使用两 (2) 列如何制作字典,例如:

some_dict = dict(zip(df['col1'],df['col2']))

但不像上面列出的那样。

此外,如果有 pandas 解决方案,那将是最理想的。

因为如果我弄清楚如何使用键值 = 列表创建字典,我计划循环它以更改格式并创建所需的 DataFrame,并且循环并不总是可取的,尤其是在处理大型 DataFrame 时。

如有任何帮助,我们将不胜感激。干杯!

编辑

刚刚弄清楚如何创建一个以列表作为值的字典:

>>> x = df.set_index('id').T.to_dict('list') 
>>> x 
{1: ['a', 'f', 'k'], 2: ['b', 'g', 'l'], 3: ['c', 'h', 'm'], 4: ['d', 'i', ''], 5: ['e', 'j', '']} 

所以我现在的问题是如何利用这个字典创建一个新的数据框作为所需的输出。

谢谢。

请您参考如下方法:

试试这个:

df.replace('', np.nan).set_index('id').stack().reset_index(name='tag').drop('level_1',1) 
 
Out[100]: 
    id tag 
0    1   a 
1    1   f 
2    1   k 
3    2   b 
4    2   g 
5    2   l 
6    3   c 
7    3   h 
8    3   m 
9    4   d 
10   4   i 
11   5   e 
12   5   j