Pandas:将列中的列表展开到不同的行

时间:2015-11-01 13:01:07

标签: python pandas

我有一个包含大量列的数据集,其中包含多个值(从谷歌表单导入,这些列允许多个选择)。我最初将它们作为列表导入。

现在我想基于这些列中的一些值来分析数据,即给定

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将是具有选项的行的总数:

2 个答案:

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

enter image description here

(问题原始版本的上一个答案):

您可以使用地图获取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