使用Pandas将数据框中的多个列转换为单个列

时间:2019-05-02 12:10:01

标签: pandas

我的datafarme输入如下,我想转换为输出格式

A         B          C       D       E       F  
Fruits  apple       val1    val2    NaN     val4
Fruits  mango       val1    val2    NaN     val4
Fruits  jack fruit  val1    val2    NaN     val4
Fruits  pomegranate val1    val2    NaN     NaN
Fruits  kiwi        val1    val2    NaN     NaN
Fruits  plum        val1    val2    val3    NaN
Fruits  banana      val1    val2    val3    NaN
Fruits  grapes      val1    val2    val3    NaN


output:
-------
Fruits  apple           val1
Fruits  mango           val1
Fruits  jack fruit      val1
Fruits  pomegranate     val1
Fruits  kiwi            val1
Fruits  plum            val1
Fruits  banana          val1
Fruits  grapes          val1
Fruits  apple           val2
Fruits  mango           val2
Fruits  jack fruit      val2
Fruits  pomegranate     val2
Fruits  kiwi            val2
Fruits  plum            val2
Fruits  banana          val2
Fruits  grapes          val2
Fruits  plum            val3
Fruits  banana          val3
Fruits  grapes          val3
Fruits  apple           val4
Fruits  mango           val4
Fruits  jack fruit      val4

并且我需要使用熊猫来根据列中的值创建单独的行。

3 个答案:

答案 0 :(得分:0)

您可以使用pd.melt

d = df.melt(["A", "B"], ["C", "D", "E", "F"])
d.drop('variable', axis=1, inplace=True)
d.dropna()

输出:

         A            B value
0   Fruits        apple  val1
1   Fruits        mango  val1
2   Fruits    jackfruit  val1
3   Fruits  pomegranate  val1
4   Fruits         kiwi  val1
5   Fruits         plum  val1
6   Fruits       banana  val1
7   Fruits       grapes  val1
8   Fruits        apple  val2
9   Fruits        mango  val2
10  Fruits    jackfruit  val2
11  Fruits  pomegranate  val2
12  Fruits         kiwi  val2
13  Fruits         plum  val2
14  Fruits       banana  val2
15  Fruits       grapes  val2
21  Fruits         plum  val3
22  Fruits       banana  val3
23  Fruits       grapes  val3
24  Fruits        apple  val4
25  Fruits        mango  val4
26  Fruits    jackfruit  val4

答案 1 :(得分:0)

您可以使用set_index,然后使用stack

df.set_index(['A', 'B']).stack().reset_index()

答案 2 :(得分:0)

使用此:

l1 = [ df[['A','B',i]].rename(columns={i:'value'}) for i in ['C','D','E','F']]
df1 = pd.DataFrame()
for i in l1:
   df1 = df1.append(i)

df1 = df1[~pd.isnull(df1['value'])].reset_index(drop=True)

输出:

         A            B value
0   Fruits        apple  val1
1   Fruits        mango  val1
2   Fruits   jack fruit  val1
3   Fruits  pomegranate  val1
4   Fruits         kiwi  val1
5   Fruits         plum  val1
6   Fruits       banana  val1
7   Fruits       grapes  val1
8   Fruits        apple  val2
9   Fruits        mango  val2
10  Fruits   jack fruit  val2
11  Fruits  pomegranate  val2
12  Fruits         kiwi  val2
13  Fruits         plum  val2
14  Fruits       banana  val2
15  Fruits       grapes  val2
16  Fruits         plum  val3
17  Fruits       banana  val3
18  Fruits       grapes  val3
19  Fruits        apple  val4
20  Fruits        mango  val4
21  Fruits   jack fruit  val4