我有以下数据框:
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]
有没有更好的方法,也许直接在大熊猫中呢?
答案 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,以获得更稳定的方法来仅使某些类型的可迭代对象变平坦。