【问题标题】:Subsetting a dataframe based on row value, where the row value and column name is stored in a VARIABLE根据行值对数据框进行子集化,其中行值和列名存储在 VARIABLE 中
【发布时间】:2017-10-22 07:55:39
【问题描述】:
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 发布解决方案,但我绝对需要将行值和列名存储在 variables 中。

我尝试过使用eval 之类的方法来打印变量中的值,但无济于事。如果我问了一些不可能实现的问题,我提前道歉。

预期输出将是一个空数据框,因为当代码迭代其键是列名的唯一现有行值的字典时,df = df[df.var == k] 等效于 df = df[df.this == 'fruit']df = df[df.this == 'vegetable'] '这个'

【问题讨论】:

  • 你能添加预期的输出吗
  • 答案是肯定的……无论你想做什么,答案都是肯定的! ...问题是,我无法弄清楚您要做什么。请提供一些内容,向我们展示您期望的结果。
  • 除非我们正确理解问题,否则在编码中没有什么是不可能的。
  • @Bharathshetty 添加了它。我想要完成的想法是,使用 VARIABLES 作为行值和列名。没有得到预期的输出。
  • 不要使用. 使用像df[var_name] 这样的索引。看看这个stackoverflow.com/questions/46861214/…

标签: python pandas variables dataframe


【解决方案1】:

使用isin:

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

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

请注意,在引用具有变量名称的列时,不能使用 dot 表示法。您需要使用[...] 语法。如需详细了解在哪些地方可以使用和不能使用点符号,请参阅here

如果列名,则不能使用点符号访问列

  • 以数字开头
  • 包含空白字符
  • 包含运算符符号和标点符号
  • 与现有方法名称或属性冲突

点符号类似于访问对象的属性,你 如果要访问它们,必须遵循 python 的变量命名规则 那样。对于其他任何事情,您都必须使用[...]

如需更详细的视图,请查看底部的注释 documentation.

此外,不要使用dict 来命名变量,这会影响具有相同名称的内置dict 类。现在你已经使用了它,使用del dict 来取回 dict 功能。

【讨论】:

    【解决方案2】:

    使用点符号 [] 和 insted 名称 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

    【讨论】:

    • @cᴏʟᴅsᴘᴇᴇᴅ - 我理解 OP 问题,这是代码的一部分(这是没有问题的),您的 .isin 用于过滤所有 var 列的所有 keys。所以两个答案都有不同的输出。
    • 谢谢。有时我更喜欢遵循“给 OP 他们需要的东西,但不知道他们做了什么”,而不是“给 OP 他们要求的东西,即使这没有意义”。有时两者都做会更好!干杯。
    • @cᴏʟᴅsᴘᴇᴇᴅ - 我认为最好的方法是创建具有所需输出的答案并解释,如果它应该有问题。
    【解决方案3】:

    我会写这个作为评论,但没有足够的声誉。

    除了答案之外,我想添加两个注释,它们很好地解决了问题。

    注意 1:不要使用 dict 作为变量名,因为它是一个内置

    注意2:如果你在访问df时使用了变量,你可能不确定属性是否在df中,因此你也可以使用builtin 函数 getattr(df, var, None),其中 第三个​​ 参数是在 df 没有属性 var 的情况下返回的内容。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2013-08-15
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多