我有一个包含大量列的数据集,其中包含多个值(从谷歌表单导入,这些列允许多个选择)。我最初将它们作为列表导入。
现在我想基于这些列中的一些值来分析数据,即给定
df = pd.DataFrame(dict(a=[(1,2),(2,3),(1,)], b=[(1,3),(2,5),], c=['a','b','c']))
a b c
0 (1, 2) (1, 3) a
1 (2, 3) (2, 5) b
2 (1) () c
我想绘制一个条形图,其中X将是a和b列的不同值(它们共享同一组选项),Y将是具有选项的行的总数:
答案 0 :(得分:1)
您可以通过对列进行求和(基本上连接内容)然后在它们上调用pd.value_counts
来完成此操作。例如(稍微修改数据帧定义,以免引发错误):
df = pd.DataFrame(dict(a=[(1,2),(2,3),(1,)],
b=[(1,3),(2,5),()],
c=['a','b','c']))
counts = pd.DataFrame({col: pd.value_counts(df[col].sum())
for col in ['a', 'b']})
counts.plot(kind='bar')
(问题原始版本的上一个答案):
您可以使用地图获取2
a
所在的所有行,例如
>>> df = pd.DataFrame(dict(a=[[1,2],[2,3],[1,3]], b=['a','b','c']))
>>> df
a b
0 [1, 2] a
1 [2, 3] b
2 [1, 3] c
>>> df[df.a.map(lambda L: 2 in L)]
a b
0 [1, 2] a
1 [2, 3] b
您可以使用groupby
后跟filter
来完成类似的操作,但首先必须将a
值转换为元组,以便它们可以清理(和可以是组密钥):
>>> df.groupby(df.a.map(tuple)).filter(lambda group: 2 in group.name)
a b
0 [1, 2] a
1 [2, 3] b
如果您有这些结果中的任何一个,则可以使用,例如result['a'] = 2
替换a
列中的值。
答案 1 :(得分:1)
我们可以使用布尔索引来过滤记录2
中没有'a'
的记录。
df = pd.DataFrame(dict(a=[[1,2],[2,3],[5,6]], b=['a','b','c']))
df
Out[16]:
a b
0 [1, 2] a
1 [2, 3] b
2 [5, 6] c
df[df.a.apply(lambda x: 2 in x)]
Out[17]:
a b
0 [1, 2] a
1 [2, 3] b