我有一个有大量列的数据集,其中包含多个值(从google导入,这些列允许多个选择)。我一开始就把它们作为列表导入。
现在,我想根据这些列中的一些值来分析数据,即
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将是拥有该选项的行的总数:
发布于 2015-11-01 05:33:40
您可以通过对列进行求和(基本上是连接内容),然后对它们调用pd.value_counts
来做到这一点。例如(稍微修改dataframe定义,这样它就不会引发错误):
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
列中的值。
发布于 2015-11-01 05:34:06
我们可以使用布尔索引来过滤记录,在列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
https://stackoverflow.com/questions/33462401
复制相似问题