从熊猫数据框获取值,拆分列表

时间:2018-12-29 07:02:39

标签: python pandas

我有以下数据框:

  address.state    address.town      dates 
0            MI     Dearborn         None
1            CA  Los Angeles         [2014-01-01, 2015-01-01]

我将如何获取该列的所有值的列表,如果有列表值,则将其拆分。例如:

>>> df['address.state']
['MI', 'CA'] # length of 2
>>> df['dates']
[None, '2014-01-01', '2015-01-01'] # length of 3

如果df列中的任何值都有一个列表字段,我将如何以通用的方式做到这一点?

当前我正在做的是

_values = []
for _val in df.iloc[:,col_index]:
    if not isinstance(_val, list):
        _values.append(_val)
    else:
        _values.extend(_val)

>>> _values
['2014-01-01', '2015-01-01', None]

有没有更好的方法,也许直接在大熊猫中呢?

2 个答案:

答案 0 :(得分:1)

我想我最初是看错了这个问题:

在每一列中获取唯一值:

df['col'].apply(pd.Series).stack().unique()

例如:

df = pd.DataFrame({'address': ['MI' , 'CA'], 'name':['John', 'Jane'], 'list': [['ab', 'cd'], 'e']})

df
Out[4]: 
  address      list  name
0      MI  [ab, cd]  John
1      CA         e  Jane

df['list'].apply(pd.Series).stack().unique()
Out[5]: array(['ab', 'cd', 'e'], dtype=object)

.apply(pd.Series) 将列表转换为多个新列中的单个元素。

stack将多列重新堆叠为一列。

unique()获取该列的唯一值。

答案 1 :(得分:1)

使用.tolist()生成列的列表。然后,唯一的事情就是您将在列表中获得一个列表。要整理列表,如果其中没有多字符字符串:

>>> l = ['a',['b','c']]
>>> l
['a', ['b', 'c']]
>>> flat_list = [item for sublist in l for item in sublist]
>>> flat_list
['a', 'b', 'c']

({flat_list解决方案来自How to make a flat list out of list of lists?

: 但是请注意,输入中可迭代的 any 将被展平,包括多字符字符串:

>>> l = ['one item', ['b', 'c']]
>>> [item for sublist in l for item in sublist]
['o', 'n', 'e', ' ', 'i', 't', 'e', 'm', 'b', 'c']

这可能不是您想要的。请查看this discussion,以获得更稳定的方法来仅使某些类型的可迭代对象变平坦。