如何将多个列重新排列成一个具有相同索引的列?

3

我正在使用Python Pandas,我想将一个相同的索引调整到多个列中,并将其合并成一列。如果可能的话,我还想删除零值。

我有这个数据框

index A B C 
a     8 0 1 
b     2 3 0
c     0 4 0 
d     3 2 7 

我希望我的输出看起来像这样。
index data value
a     A    8 
b     A    2
d     A    3
b     B    3
c     B    4
d     B    2
a     C    1
d     C    7

===
我以下面的方式解决了这个任务。我的原始数据在dataframe中有2个索引和0,是NaN值。

首先,我尝试使用melt函数来删除NaN值,并遵循以下步骤(Pandas如何融化数据框并删除NA值),但我做不到。 因为我的原始数据有几列('value_vars')。所以我通过2个步骤重新组织了数据帧:

  1. 首先,我用melt函数将多列合并为一列,
  2. 然后通过dropna函数在每行中删除NaN值。

Coding Script Snipppet


你使用的是哪个版本的Python?你导入和使用了哪个特定的Python模块来完成这个任务?最后但同样重要的是,你到目前为止尝试了什么? - araknoid
@araknoid 我正在使用Python 3.6.1。我试图使用Pandas完成这个任务。因为我是Python的新手,所以我通过应用示例代码来学习模块和包。所以我试图找到一个将多列合并为一列并保持相同索引的代码。但我只能找到将“单列拆分为多列”或按列行合并多列数据的方法。所以我上传了这个问题。 - Jay
2个回答

3
这看起来有点像pandas中的melt函数,唯一的区别在于索引。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html
以下是一些可供测试的代码:
import pandas as pd
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},'B': {0: 1, 1: 3, 2: 5},'C': {0: 2, 1: 4, 2: 6}})
pd.melt(df)

我的jupter笔记本的图片

通过一些操作,您可以解决索引问题。

这并不特别符合Python风格,但如果您只有有限数量的列,则可以使用以下方法:

molten = pd.melt(df)
a = molten.merge(df, left_on='value', right_on = 'A') 
b = molten.merge(df, left_on='value', right_on = 'B') 
c = molten.merge(df, left_on='value', right_on = 'C') 
merge = pd.concat([a,b,c])

Merge of the melted data frames


谢谢!我使用了melt函数并解决了这个任务。 - Jay

0

试一下这个:

array = [['a', 8, 0, 1], ['b', 2, 3, 0] ... ]
cols = ['A', 'B', 'C']

result = [[[a[i][0], cols[j], a[i][j + 1]] for i in range(len(a))] for j in range(2)]

输出:

[[['a', 'A', 8], ['b', 'A', 2]], [['a', 'B', 0], ['b', 'B', 3]] ... ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接