python - 将 pandas 列值转换为行

标签 python pandas

我正在尝试将数据框转换为长格式。

我开始的数据框:

df = pd.DataFrame([['a', 'b'],
                   ['d', 'e'], 
                   ['f', 'g', 'h'],
                   ['q', 'r', 'e', 't']])
df = df.rename(columns={0: "Key"})

    Key 1   2   3
0   a   b   None    None
1   d   e   None    None
2   f   g   h       None
3   q   r   e       t

不指定列数,可能超过4列。键后每个值应该有一个新行

这得到了我所需要的,但是,似乎应该有一种方法可以做到这一点而不必删除空值:

new_df = pd.melt(df, id_vars=['Key'])[['Key', 'value']]
new_df = new_df.dropna()


    Key value
0   a   b
1   d   e
2   f   g
3   q   r
6   f   h
7   q   e
11  q   t​

最佳答案

选项 1
你应该能够用 set_index + stack 来做到这一点:

df.set_index('Key').stack().reset_index(level=0, name='value').reset_index(drop=True)

  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t

如果你不想一直重置索引,那么使用一个中间变量并创建一个新的DataFrame:

v = df.set_index('Key').stack()
pd.DataFrame({'Key' : v.index.get_level_values(0), 'value' : v.values})

  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t

这里的本质是 stack 默认情况下会自动摆脱 NaN(您可以通过设置 dropna=False 来禁用它)。


选项 2
使用 np.repeat 和 numpy 版本的 pd.DataFrame.stack 获得更多性能:

i = df.pop('Key').values
j = df.values.ravel()

pd.DataFrame({'Key' : v.repeat(df.count(axis=1)), 'value' : j[pd.notnull(j)]
})

  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t

关于python - 将 pandas 列值转换为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49441053/

相关文章:

python - 为什么 Pandas 绘制索引值 (x_ticklabels) 不正确?

python - 在 Spyder 2.1 上安装/导入 sklearn 模块? (Ubuntu)

python - Python 中的 Violin Plot 在对数尺度上的问题

python - 当类别是多字符串中的单个字符时创建虚拟对象

python - 填写缺失日期的快捷方式

Python:如何将函数的结果分配给我可以读取的变量_csv

python - 当文件在磁盘上更改时自动重新加载 jupyter notebook

python - python 中的 Firebase 用户身份验证

python - 通过一次附加多行创建 Polars 数据框

python - 具有不同数据类型列的 Pandas 数据框的列切片是否创建 View 或副本?