是否可以在pandas中将列表用作单个列值?

时间:2018-01-21 16:25:25

标签: python python-3.x pandas

我有这样的字典:

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

2 个答案:

答案 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