繁体   English   中英

熊猫:将列中的列表扩展为不同的行

[英]Pandas: expand list in column to distinct rows

我有一个数据集,其中包含大量包含多个值的列(从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是具有该选项的行的总数:

您可以通过对列求和(基本上是将内容串联起来),然后对它们调用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')

在此处输入图片说明


(该问题的原始版本的先前答案):

您可以使用地图获取2a所有行,例如

>>> 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列中的值。

我们可以使用布尔索引来过滤在'a'列中没有2记录。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM