【问题标题】:Pandas column of non-unique lists into column names with filled entries将非唯一列表的 Pandas 列转换为填充条目的列名
【发布时间】:2016-05-03 17:53:44
【问题描述】:

我有一个数据框data:

import pandas as pd
data = pd.DataFrame({"col1" : ['1_xy','2_xy','3_xy','4_xy','5_xy'], 
                     "col2" : [['a', 'b', 'c'], 
                               ['d', 'e', 'f', 'g', 'h', 'i'], 
                               ['a', 'j', 'k'], 
                               ['a', 'b', 'd'], 
                               ['a', 'l', 'm']]})

输出:

    col1    col2
0   1_xy    [a, b, c]
1   2_xy    [d, e, f, g, h, i]
2   3_xy    [a, j, k] 
3   4_xy    [a, b, d]
4   5_xy    [a, l, m]

我正在尝试将此数据帧转换为如下所示的数据帧:

import re
new_data = pd.DataFrame({'col1': ['1_xy','2_xy','3_xy','4_xy','5_xy'],
                     'a' : [1,0,1,1,1], 'b' : [1,0,0,1,0],
                     'c' : [1,0,0,0,0], 'd' : [0,1,0,1,0],
                     'e' : [0,1,0,0,0], 'f' : [0,1,0,0,0],
                     'g' : [0,1,0,0,0], 'h' : [0,1,0,0,0],
                     'i' : [0,1,0,0,0], 'j' : [0,0,1,0,0],
                     'k' : [0,0,1,0,0], 'l' : [0,0,0,0,1],
                     'm' : [0,0,0,0,1]})
new_data[["col1"] + [name for name in new_data.columns if not re.search("col1", name)]]

输出:

    col1    a   b   c   d   e   f   g   h   i   j   k   l   m
0   1_xy    1   1   1   0   0   0   0   0   0   0   0   0   0
1   2_xy    0   0   0   1   1   1   1   1   1   0   0   0   0
2   3_xy    1   0   0   0   0   0   0   0   0   1   1   0   0
3   4_xy    1   1   0   1   0   0   0   0   0   0   0   0   0
4   5_xy    1   0   0   0   0   0   0   0   0   0   0   1   1

即新数据框的列由来自data.col2 的列表中的唯一值组成,并且值由与列表中的条目对应的值填充。

到目前为止,我一直在玩pandas.get_dummies,但它会创建我无法控制的虚假列。

我尝试对其执行此操作的真实数据非常高(很多行),因此内存“可能”是一个问题,但欢迎所有解决方案。我应该补充一点,我已经准备好使用字典方法的解决方法 - 但不幸的是,它非常缓慢。希望任何人以前都遇到过这个问题并且可以提供帮助。

我目前正在使用 python v3.4 和 pandas v0.14.1(我知道...)

【问题讨论】:

  • 你如何使用get_dummies
  • @IanS 我这样使用它:df = data["col2"].str.get_dummies(sep=","),有时它似乎有效,但我不断发现重复的列' 甚至彼此不匹配(我认为应该是预期的,并且我以错误的方式使用该命令。)我应该注意我没有在我的玩具示例中尝试过该命令。

标签: python pandas


【解决方案1】:

您可以尝试 get_dummies,通过调整参数来获得正确的列名:

df = pd.get_dummies(data.col2.apply(pd.Series), prefix='', prefix_sep='')
pd.concat([data['col1'], df], axis=1)

Out[31]:
   col1  a  d  b  e  j  l  c  d  f  k  m  g  h  i
0  1_xy  1  0  1  0  0  0  1  0  0  0  0  0  0  0
1  2_xy  0  1  0  1  0  0  0  0  1  0  0  1  1  1
2  3_xy  1  0  0  0  1  0  0  0  0  1  0  0  0  0
3  4_xy  1  0  1  0  0  0  0  1  0  0  0  0  0  0
4  5_xy  1  0  0  0  0  1  0  0  0  0  1  0  0  0

【讨论】:

  • 感谢您的建议,但是当我尝试它时会引发 ValueError 异常。你用的是哪个版本的熊猫?
  • 版本 0.15.2,是 apply 还是 get_dummies 有问题?
  • 'apply' 对我有用(我自己最近一直在走这条路,它返回了一些有希望的东西。)抛出异常的是 get_dummies。我得到:“TypeError:'numpy.int64'对象不可迭代”。我想我可能不得不玩弄类型——还是我弄错了?
  • 我还应该说我也得到了以下信息:“ValueError: could not broadcast input array from shape (5,6) into shape (5)”
  • 我切换到另一个版本的 pandas (0.16.2),然后它对我有用。似乎这是熊猫的版本特定问题。我不确定是否接受您的回答,即使它确实适用于更成熟的熊猫版本。我自己的想法倾向于收敛到是的......
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2017-12-19
  • 1970-01-01
相关资源
最近更新 更多