我有这个数据框
df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]
我想要这样
df2=[('f', {'abe': 1}), ('f', {'tbeli': 1})]
df3=[('g', {'mos': 1}), ('g', {'esc': 1})]
我试过这段代码
L1 = [year for (title, year) in (sorted(df1.items(), key=lambda t: t[0]))]
答案 0 :(得分:2)
过滤列表的一种方法是将其拆分为由' f'索引的子列表。或' g':
from collections import defaultdict
df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]
df = defaultdict(list)
for item in df1:
df[item[0]].append(item)
df2 = df['f']
df3 = df['g']
print(df2)
print(df3)
输出:
[('f', {'abe': 1}), ('f', {'tbeli': 1})]
[('g', {'mos': 1}), ('g', {'esc': 1})]
答案 1 :(得分:0)
使用groupby
中的itertools
:
from itertools import groupby
df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]
splitted = [list(v) for k, v in groupby(df1, key = lambda x: x[0])]
print(splitted)
<小时/> 这产生了
[[('f', {'abe': 1}), ('f', {'tbeli': 1})], [('g', {'mos': 1}), ('g', {'esc': 1})]]
之后您可以通过splitted[0]
访问各个项目,但只有在之前已对数据进行排序时才能使用。
答案 2 :(得分:0)
您应该使用字典表示可变数量的变量。
有效的方式是通过collections.defaultdict
,如@quamrana's solution所示,但这也可以通过词典理解中的列表理解来实现。
df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]
res = {i: [x for x in df1 if x[0]==i] for i, j in df1}
# {'f': [('f', {'abe': 1}), ('f', {'tbeli': 1})],
# 'g': [('g', {'mos': 1}), ('g', {'esc': 1})]}