【问题标题】:How to sort into a new DataFrame based on values within a list?如何根据列表中的值排序到新的 DataFrame 中?
【发布时间】:2021-04-15 08:11:36
【问题描述】:

例如我有:

[{'day': 'monday', 'sunny': 'yes', 'windy': 'yes', 'ended': 'yes'}, {'day': 'tuesday', 'sunny': 'no', 'windy': 'yes', 'ended': 'no'}]

值(当天的名称和答案,即是、否等)取自用户输入(用户可以输入任意数量的内容)。 我需要将它们分类到一个 DataFrame 中,其中值被组织,例如:

如果既有晴天又有风,则必须将值排序在标题 GOOD WEATHER 下。 如果只是晴天不刮风,那一定是在 HOT WEATHER 下,等等...... 如果一天已结束,则不应显示当天的任何内容。

我该怎么做? 以这种方式对 DataFrame 进行排序后,我必须将其写入 csv 文件。 对 Python 非常陌生,所以请使用更简单的解释/函数等。

【问题讨论】:

    标签: python list dataframe nested-lists


    【解决方案1】:

    考虑到您正在获取 Json 列表中的输入,即 Python 中的 dicts。

    因此将该输入存储在一个变量中并创建一个新的空数据框,其中包含 2 个名为 GOOD WEATHERHOT WEATHER 的列,如下所示:

    import pandas as pd
    
    test = [{'day': 'monday', 'sunny': 'yes', 'windy': 'yes', 'ended': 'yes'}, {'day': 'tuesday', 'sunny': 'yes', 'windy': 'yes', 'ended': 'no'}]
    Mydataframe = pd.DataFrame({'GOOD WEATHER': [], 'HOT WEATHER': []})
    

    然后我们遍历输入列表,这将是我们的字典并检查您提到的条件。您可以在嵌套的 if-else 中添加更多条件。

    for data in test:
        if data['ended'] == 'no':
            if data['sunny'] == 'yes':
                if data['windy'] == 'yes':
                    Mydataframe = Mydataframe.append([{'GOOD WEATHER':data}], ignore_index=True)
                else:
                    Mydataframe = Mydataframe.append([{'HOT WEATHER':data}], ignore_index=True)
    

    因此,只要条件为真,Mydataframe.append 命令就会将值的全部数据添加到所需列中。

    PS:如果你想分离数据,你可以创建两个数据框。一个用于GOOD WEATHER,另一个用于HOT WEATHER

    【讨论】:

    • 感谢您的帮助,但不知何故数据框为空?我按照你说的做了,但它是空的。抱歉,如果我遗漏了一些明显的东西
    • 从你输入的数据来看,它会是空的,因为列表中有两个数据,一个有'end': 'yes',所以数据不会被添加。而对于其他'sunny':'no',不满足条件,不添加数据。尝试改变条件或数据以获得结果。您可以使用我的 test 列表来获得结果。
    【解决方案2】:

    对于这样的任务,您可以使用pandas。从您的示例数据创建一个数据框:

    import pandas as pd
    
    df = pd.DataFrame([{'day': 'monday', 'sunny': 'yes', 'windy': 'yes', 'ended': 'yes'}, {'day': 'tuesday', 'sunny': 'no', 'windy': 'yes', 'ended': 'no'}])
    

    导致:

        day     sunny   windy   ended
    0   monday  yes     yes     yes
    1   tuesday     no  yes     no
    

    而且您可以检查不同的条件。例如:

    # check if HOT WEATHER
    for row in range(len(df)):
    if df.loc[row,"sunny"] == "yes" and df.loc[row,"windy"] == "yes":
    
        print(f" {df.loc[row,'day']} was a day with HOT WEATHER")
    

    使用loc 函数,您可以在方括号中给出行索引和列名,以返回指定单元格中的值。也许将“HOT WEATHER”等附加到列表中或在数据框中创建一个新列。

    【讨论】:

    • 如何使用 for 循环遍历它们?显然,不建议使用 iterrows。所以如果使用列表推导,你能告诉我怎么做吗?
    • 我更新了我的帖子以包含一个循环来遍历数据帧的每一行。 (目前无法测试)
    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2011-08-21
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多