我有这样的字典:
d = {'name': 'John',
'part': ['A', 'B', 'C']}
我试图从这些记录中创建一个pandas数据框,例如:
+----+---------------------+
|name| part |
+----+---------------------+
|John| ['A', 'B', 'C'] |
+----+---------------------+
|Bill| ['F', 'B', 'H'] |
+----+---------------------+
|Jack| ['R', 'N', 'L'] |
+----+---------------------+
我需要能够根据part
列表的内容选择行。类似的东西:
df.part.isin(['B', 'A'])
它应该给我约翰和比尔排。有可能吗?
UPD 抱歉愚蠢的问题,但如何从列表中创建单个单元格值?如果我尝试:
df = pd.DataFrame(d)
它给出了:
name part
0 John A
1 John B
2 John C
答案 0 :(得分:2)
我认为您需要将lists
转换为set
并使用&
测试成员资格,最后按boolean indexing
过滤:
df = df[df['part'].apply(set) & set(['A','B'])]
print (df)
name part
0 John [A, B, C]
1 Bill [F, B, H]
<强>详细强>:
print (df['part'].apply(set) & set(['A','B']))
0 True
1 True
2 False
Name: part, dtype: bool
编辑:
d = {'name': 'John',
'part': ['A', 'B', 'C']}
df = pd.Series(d).to_frame().T
print (df)
name part
0 John [A, B, C]
答案 1 :(得分:2)
演示:
In [161]: df
Out[161]:
name part
0 John [A, B, C]
1 Bill [F, B, H]
In [162]: df.part.apply(lambda c: set(['B','C']) & set(c)).str.len() > 0
Out[162]:
0 True
1 True
Name: part, dtype: bool
In [163]: df.part.apply(lambda c: set(['X','Y']) & set(c)).str.len() > 0
Out[163]:
0 False
1 False
Name: part, dtype: bool