【问题标题】:From lists in a column to rows [duplicate]从列中的列表到行[重复]
【发布时间】:2021-01-23 07:50:24
【问题描述】:

我有这个数据框

Node                  TLW                            
1                  [2, 22, 3]                           
2                     [12]                              
3                    [2,43]                             
4                     [3]                             
5                     [11]  

                        

我想要这样的东西

Node
1
2
3
4
5
22
12
43
11

你能告诉我如何获得它吗? 我会尝试在列表中使用 for 循环,然后附加到我的数据框,检查重复项。这将是我的方法,但我在这里使用 for 循环仍然有困难。 我正在考虑使用explode,但输出不是我想要的,因为(不同的)数字(或字符串)应该在Node 列中,而不是在TLW 中。

【问题讨论】:

  • 您可以将 Node 列和 TLW 列组合成一个列表,用于每一行,然后使用explode。检查我的解决方案,其中详细说明了这一点以及另一个替代方案。

标签: python pandas


【解决方案1】:

方法一

一种方法是使用apply+lambdaNodeTLW 列合并到一个列表中。然后使用explode 并使用unique()。发布重新创建具有单列的数据框Node

d = {'Node': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
     'TLW': {0: [2, 22, 3], 1: [12], 2: [2,43], 3: [3], 4: [11]}}
df = pd.DataFrame(d)

nodes = df.apply(lambda x: [x['Node']]+ x['TLW'], axis=1).explode().unique()
new_df = pd.DataFrame(nodes, columns=['Node'])
print(new_df)
  Node
0    1
1    2
2   22
3    3
4   12
5   43
6    4
7    5
8   11

方法二

另一种方法是在df.explode 之后使用numpy 的np.unique -

import numpy as np

d = {'Node': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
     'TLW': {0: [2, 22, 3], 1: [12], 2: [2,43], 3: [3], 4: [11]}}
df = pd.DataFrame(d)


new_df = pd.DataFrame(np.unique(df.explode('TLW').values), columns=['Nodes'])
print(new_df)
  Nodes
0     1
1     2
2     3
3     4
4     5
5    11
6    12
7    22
8    43

【讨论】:

  • 谢谢@Akshay Sehgal。最后一个问题:如果我想在没有原始值的新数据框中添加不同的值(因此在这种情况下,新数据框中为 11、12、22、43),我该如何编辑您的代码(我我用的是第一种方法)?
  • 只是跳过 lambda 操作,只使用第二列。您可以直接在其上使用爆炸。那么你可以在两列之间做一个设置差异
  • 如果不清楚,您将其作为一个新问题发布.. 请在此处链接,以便我收到通知,我可以帮助解决它
  • 很清楚,感谢您的解释和帮助。如果您想看看我昨天提出的另一个未解决的问题,那就太好了。我认为解决方法应该和这个很相似:stackoverflow.com/questions/65852710/…Thanks
猜你喜欢
  • 2020-08-06
  • 2020-08-07
  • 2020-05-22
  • 2023-04-02
  • 2021-12-08
  • 2020-05-20
  • 2021-01-23
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多