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

标签 python pandas dataframe

你好,我有一个类似的问题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

关于python - 如何使用 Pandas 将水平数据帧结构转换为垂直结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57825837/

相关文章:

python - 打印所有可以导入的东西

python - 无法在 C++ 中导入 python pkgs

python - 为什么只有在终端中诱导 GASP 才能正常工作?

python - 将字段传递给函数。 PYTHON.Pandas

python - 将日期从一个数据框映射到另一个数据框的优雅而高效的方法 - 大数据

python - 当我将鼠标悬停在 pygame 中的按钮上时,如何弹出文本框

python - 在 pandas to_csv 方法中保留列顺序

python - Pandas - 行之间的比率

r - 如何识别一组有序列中的第一个零?

r - 从一个字符字段中提取多个值到一个新的数据表中