重塑具有列表作为值的熊猫数据框

Posted

技术标签:

【中文标题】重塑具有列表作为值的熊猫数据框【英文标题】:Reshape pandas dataframe which has lists as values 【发布时间】:2017-07-15 19:57:42 【问题描述】:

我有一个熊猫数据框,其中包含列表作为值。我想将此数据框转换为预期结果中的格式。数据框太大(100 万行)

import pandas as pd

import numpy as np

df = pd.DataFrame(
      [[['A', 'Second'], [], 'N/A', [6]],
      [[2, 3], [3, 4, 6], [3, 4, 5, 7], [2, 6, 3, 4]]],
      columns=list('ABCD')
      )

df.replace('N/A',np.NaN, inplace=True)

df

    A           B        C          D
0   [A,Second]  []       NaN        [6]
1   [2,3]       [3,4,6] [3,4,5,7]   [2,6,3,4]

预期结果

0 A A
0 A Second
0 D 6
1 A 2
1 A 3
1 B 3
1 B 4
1 B 6
1 C 3
1 C 4
1 C 5
1 C 7
1 D 2
1 D 6
1 D 3
1 D 4

`

【问题讨论】:

【参考方案1】:

你可以使用双stack

df1 = df.stack()
df = pd.DataFrame(df1.values.tolist(), index=df1.index).stack()
       .reset_index(level=2,drop=True).reset_index()
df.columns = list('abc')
print (df)
    a  b       c
0   0  A       A
1   0  A  Second
2   0  D       6
3   1  A       2
4   1  A       3
5   1  B       3
6   1  B       4
7   1  B       6
8   1  C       3
9   1  C       4
10  1  C       5
11  1  C       7
12  1  D       2
13  1  D       6
14  1  D       3
15  1  D       4

【讨论】:

正是我想要的。谢谢!你让我开心。【参考方案2】:
df.stack().apply(pd.Series).stack().reset_index(2, True) \
  .rename_axis(['a', 'b']).reset_index(name='c')

    a  b       c
0   0  A       A
1   0  A  Second
2   0  D       6
3   1  A       2
4   1  A       3
5   1  B       3
6   1  B       4
7   1  B       6
8   1  C       3
9   1  C       4
10  1  C       5
11  1  C       7
12  1  D       2
13  1  D       6
14  1  D       3
15  1  D       4

【讨论】:

以上是关于重塑具有列表作为值的熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中使用列表作为值?

根据列标签重塑熊猫中的数据框

从列A数据框A到数据框B中的C的匹配值,并使用熊猫从数据框A创建不匹配的列表

将数组列表作为列附加到具有相同列索引的熊猫数据框中

熊猫数据框:在固定其他列的列中提取具有特定标准/条件最小值的数据[重复]

合并两个具有共同值的熊猫数据框,这些数据框在一个数据框中显示为列,而在另一个数据框中显示为行