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

时间:2017-08-08 14:21:23

标签: python pandas melt

我正在使用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

===
我解决了这个任务如下。我的原始数据有2个索引&数据框中的0为NaN值。

首先,我尝试应用melt函数,同时删除此How to melt a dataframe in Pandas with the option for removing NA values之后的NaN值,但我不能。 因为我的原始数据有几列('value_vars')。所以我通过两个步骤重新组织数据框架:

  1. 首先,我通过melt函数
  2. 将多列编成一列
  3. 然后通过NaN函数删除了每行中的dropna值。
  4. Coding Script Snipppet

2 个答案:

答案 0 :(得分:2)

这看起来有点像melt中的pandas函数,唯一的区别是索引。

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)

Image of the my jupter notebook

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

这不是特别pythonic,但如果您的列数有限,您可以使用以下内容:

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

答案 1 :(得分: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]] ... ]