【问题标题】:how to pass user input as a method?如何将用户输入作为方法传递?
【发布时间】:2021-10-19 18:06:39
【问题描述】:

我正在尝试提示用户在 pandas 数据框中输入列名,然后使用该输入来显示有关该列的信息。
我试过的代码:

df = #initializing dataframe
user_input = input('enter column name')
print(df.user_input.describe())

但我得到了错误:

df has no attribute user_input

假设用户输入实际上是有效的列名,我该如何以这种方式使用输入?

【问题讨论】:

    标签: python pandas methods


    【解决方案1】:

    您还可以使用df[] 访问列。试试:

    df[user_input].describe()
    

    另一种方法是使用getattr()

    getattr(df, user_input).describe()
    

    我认为这很“不自然”。

    【讨论】:

    • 感谢您的回答,但我无法投票,因为我是新来的。
    【解决方案2】:

    pandas 允许您将列查找为属性引用,如果它符合 python 的语法规则并且不干扰对象上的现有属性。在您的情况下,pandas 会查找一个字面上名为“user_input”的列。

    查找列的更通用方法是使用索引。它没有相同的约束。所以,

    f = #initializing dataframe
    user_input = input('enter column name')
    print(df[user_input].describe())
    

    现在pandas 将使用用户输入的字符串来查找列。

    编程的一个规则[1] 是应该只有一种“正确的方式”做事。显然,对于 pandas 或 python 而言,情况并非如此。但是组织可以定义他们认为“正确”的内容。由于列的属性查找有时只有效,所以应该使用它吗?值得商榷!

    [1]:代码更像是你所说的“指导方针”,而不是实际的规则。-Hector Barbossa,Black Perl 的船长。

    【讨论】:

    • 什么规则是应该有 1 并且只有 1 正确的做事方式?那是哪个节目? Perl 程序员不是程序员?他们在做什么?
    • @Hanselmann - PEP 20 - The Zen of Python: 应该有一种——最好只有一种——明显的方法。按属性查找列并不涵盖所有情况并且通常以混合列和索引查找结束 - 丑陋!与map 类似 - 它仅在边缘条件下有用,请使用理解。将 lambda 分配给变量 my_fctn = lamba x: x**2 ... 改为使用 def my_fctn。一个好的代码审查方案包括一个风格指南。至于 perl... 什么?我没有提到 perl。
    • 你说的是“一个编程规则”;包含 Perl 还不够笼统吗?
    • @Hanselmann - 如果我理解你的话,就不应该有风格指南,因为有不止一种编程语言。这是一个奇怪的立场。假设我有一个包含"starting", "until", "access mode", "update", 3 列的数据框。不是所有的都可以是属性。显然“更新”不能。而且,假设 pandas 决定添加一个“直到”函数 - 现在你崩溃了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多