根据行值子集数据框,其中行值和列名称存储在VARIABLE

时间:2017-10-22 07:55:40

标签: python pandas variables dataframe

import pandas as pd
df = pd.DataFrame(data=np.array([["fruit", 12341], ["vegetable", 45642]]))
df.columns = ['this','result']

这是数据框的样子

     this        result
0    fruit       12341
1    vegetable   45642

'this'和'result'是列名。 假设其中一个列名存储为名为'var'

的字符串变量

“this”列中的行值“fruit”之一存储为名为“dict”的字典中的键。

var = 'this'
dict = {'fruit': 'apple', 'vegetable': 'orange'}

我正在尝试执行下面代码中显示的一些子集

for k, v in dict.items():
    print(k)
    print(type(k)) #<class 'str'>
    df = df[df.var == k]

df

我知道已经知道了

    df = df[df.this == 'fruit']
    df = df[df.this == 'vegetable']

但行值和列名将仅作为字符串变量存储!无论如何,您可以对行值和列名称为变量的数据框进行子集

除非你们知道,否则我不确定这是否可行。我不介意使用loc或iloc发布解决方案,但我绝对需要将行值和列名存储在变量中。

我尝试过使用eval之类的东西来打印变量中的值但无济于事。如果我问过一些无法实现的事情,我会提前道歉。

预期输出将是一个空数据框,因为df = df[df.var == k]等同于df = df[df.this == 'fruit']df = df[df.this == 'vegetable']当代码遍历字典时,其密钥是唯一存在的列名'this'的行值

3 个答案:

答案 0 :(得分:2)

使用isin

df = df[df[var].isin(dct.keys())]

这摆脱了循环(好吧,它不会导致空数据帧,但为什么你想要一个空的数据帧?)。

请注意,在引用具有变量名称的列时,不能使用 dot 表示法。您需要使用[...]语法。有关您可以使用点符号的详细信息,请参阅here

  

如果列名称

,则无法使用点表示法来访问列      
      
  • 以数字开头
  •   
  • 包含空格字符
  •   
  • 包含运算符符号和标点符号
  •   
  • 与现有方法名称或属性冲突
  •   
     

点符号类似于访问对象的属性,而您   如果要访问它们,必须遵循python的变量命名规则   那样。除此之外,您还必须使用[...]

     

有关更详细的视图,请查看底部的注释   documentation

此外,请勿使用dict来命名变量,这会影响内置dict类的同名。现在您已经使用它,使用del dict来获取dict功能。

答案 1 :(得分:1)

改为使用点符号[]并使用dict作为dict1d,因为dict是python中的代码字。

d = {'fruit': 'apple', 'vegetable': 'orange'}

for k, v in d.items():
    print(k)
    df = df[df[var] == k]
    print (df)

#first loop
fruit    
    this result
0  fruit  12341

#second loop
vegetable
Empty DataFrame
Columns: [this, result]
Index: []

但是如果在第一次迭代中输出由第一个键过滤,那么总是第二个循环返回空数据帧,因为第一个循环(过滤数据帧)的输出被分配给变量df

答案 2 :(得分:0)

我会把它写成评论,但没有足够的声誉。

除了答案之外,我还要添加两个注释,以便很好地解决问题。

注1:不要将dict用作变量名,因为它是内置

注意2:如果您在访问 df 时使用变量,则可能无法确定该属性是否在 df 中,因此您也可以使用 builtin function getattr(df, var, None),其中第三个​​参数是 df 没有属性 var 时返回的参数。< / p>