使用列表对 pandas 数据帧进行子集筛选

3
我想根据一些变量列表来对数据框进行子集化,即:
 list1=[var1,var2,var3]
 list2=[var4,var5,var6]

 data_final = data[list1,list2]

产生此错误的原因是:

 TypeError: unhashable type: 'list'

如果我提供一个单一的列表,一切工作正常:

 data_final = data[list1]

下面是一个最小化的例子:
dict1 = [{'var0': 0, 'var1': 1, 'var2': 2},
     {'var0': 0, 'var1': 2, 'var2': 4},
    {'var0': 1, 'var1': 5, 'var2': 8},
    {'var0': 1, 'var1': 15, 'var2': 12},]
 df = pd.DataFrame(dict1, index=['s1', 's2','s3','s4'])

  list1=['var0']
  list2=['var1','var2']

这两个命令正常运行:
  df[list1]
  df[list2]

但是这个产生了上述错误:
  df[list1,list2]

展示一个完整的例子。 - John Zwinck
我已经在原始帖子中添加了一个示例。 - Niccola Tartaglia
3个回答

2
您期望的输出是这样的吗?
df[list1 + list2]
Out[106]: 
    var0  var1  var2
s1     0     1     2
s2     0     2     4
s3     1     5     8
s4     1    15    12

太棒了!!!非常感谢!!谁能想到答案如此简单。 - Niccola Tartaglia

2
您需要将列名写在一个列表中,而不是作为列表的列表:
data_final= data[[var1,var2,var3],[var4,var5,var6]]

来自文档:

你可以通过传递一个列名的列表到 [] 中按照指定顺序选择列。如果 DataFrame 中不包含某个列,则会引发异常。也可以使用这种方式设置多个列。


1
谢谢你 Neeraj。事实上,到目前为止我已经这样做了,但是我希望有一种方法可以使用一个列表的列表,因为我的变量列表变得非常长,代码变得非常混乱。 - Niccola Tartaglia

2

如果要将任意数量的列表加载到数据框中(只要列表的长度相等),可以执行以下操作:

import pandas as pd
l1 = [1,2,3]
l2 = [10,20,30]
col_name = ['c1','c2','c3']
row_name = ['r1','r2']
pd.DataFrame([l1,l2],columns=col_name, index=row_name)

    c1  c2  c3
r1   1   2   3
r2  10  20  30

要将任意数量的列表加载到数据框中的列中,您需要像这样将列表压缩在一起:
l1 = [1,2,3]
l2 = [10,20,30]
col_name = ['c1','c2']
row_name = ['r1','r2','r3']
zipped_list = list(zip(l1,l2))

import pandas as pd

pd.DataFrame(zipped_list,columns=col_name,index=row_name)

    c1  c2
r1   1  10
r2   2  20
r3   3  30

希望这能帮到你,py-on!

也是非常好的解决方案。感谢您详细的解释,这很有用,我会把它加入我的个人备忘录中,以后肯定会派上用场。 - Niccola Tartaglia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接