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'的行值
答案 0 :(得分:2)
使用isin
:
df = df[df[var].isin(dct.keys())]
这摆脱了循环(好吧,它不会导致空数据帧,但为什么你想要一个空的数据帧?)。
请注意,在引用具有变量名称的列时,不能使用 dot 表示法。您需要使用[...]
语法。有关您可以使用点符号的详细信息,请参阅here。
如果列名称
,则无法使用点表示法来访问列
- 以数字开头
- 包含空格字符
- 包含运算符符号和标点符号
- 与现有方法名称或属性冲突
点符号类似于访问对象的属性,而您 如果要访问它们,必须遵循python的变量命名规则 那样。除此之外,您还必须使用
[...]
。有关更详细的视图,请查看底部的注释 documentation
此外,请勿使用dict
来命名变量,这会影响内置dict
类的同名。现在您已经使用它,使用del dict
来获取dict功能。
答案 1 :(得分:1)
改为使用点符号[]
并使用dict
作为dict1
,d
,因为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>