【问题标题】:How to iterate through multiple datasets with multiple conditions?如何遍历具有多个条件的多个数据集?
【发布时间】:2019-08-05 14:34:33
【问题描述】:

我正在尝试使用包含多个条件的计算迭代多个数据集,但我收到一条错误消息。我可以遍历多个列表,但它似乎不适用于数据框。

我已将一个巨大的数据集(最初来自 HDF5 文件)划分为具有相同列但用于不同建筑类型的较小数据集。现在我想遍历每个数据集来做同样的计算。计算也包括多个代码。


import pandas as pd
import numpy as np
from pandas import DataFrame

# Multiple datasets:

d1 = {'apples1': [45,2,15,0,39,6,12,7,86,24],
      'feathers1': [2,1,0,3,4,2,2,1,0,1]}
a = DataFrame(d1,columns=['apples1','feathers1'])

d2 = {'apples2': [2,52,1,27,1,5,1,28,2],
      'feathers2': [4,2,1,1,0,1,2,1,4]}
b = DataFrame(d2,columns=['apples2','feathers2'])

d3 = {'apples3': [12,5,1,23,1],
      'feathers3': [4,4,1,1,1]}
c = DataFrame(d3,columns=['apples3','feathers3'])

d4 = {'apples4': [82,53,17,28,10,5,16],
      'feathers4': [0,5,1,3,1,2,4]}
d = DataFrame(d3,columns=['apples4','feathers4'])

# Calculation iteration through all datasets:

A = []
B = []

for df in (a,b,c,d):    
    if ((df == a) | (df == b)).any(axis=1):
        k = 1
        A.append(k)
    elif ((df == c) | (df == d)).any(axis=1):
        k = 2
        B.append(k) 

如果数据框 (df) 是 a OR b,则对这些数据集执行以下计算;或者,如果数据集是 c OR d,则对这些数据集执行其他计算。 但是,我收到以下 ValueError 消息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

  • ((df == a) | (df == b)).any(axis=1) 产生一系列布尔值,length 等于您拥有的行数。例如如果您有 4 行,则可以评估为 True, False, True, True。现在,您如何解释if [True, False, True, True]?你可能想要((df == a) | (df == b)).any(axis=1).any()
  • 嗨@rafaelc!当我按照您的建议进行操作时,我收到另一条错误消息:ValueError:只能比较标记相同的 DataFrame 对象
  • 那是因为你有不同的列名。您如何比较具有不同标签(索引或列)的数据框? ;)
  • 这看起来像一个奇怪的设计,看起来像一个 XY 问题。如果我是你,我会发布你的实际问题,即你真正想要实现的目标,而不是 如何解决这个特定的解决方案
  • @rafaelc 您是否建议我将列名更改为所有相同的名称?

标签: python pandas dataframe iteration multiple-conditions


【解决方案1】:

你可以这样做:

for df in (a,b,c,d):    
    if df.equals(a) or df.equals(b):
        k = 1
        A.append(k)
    elif df.equals(c) or df.equals(d):
        k = 2
        B.append(k) 

equals() 要求元素与其他 Series 或 DataFrame 中的各自元素具有相同的 dtype。但是,列标签不需要具有相同的类型,只要它们仍然被认为是相等的即可。

【讨论】:

    【解决方案2】:

    我之前遇到过这个问题并尝试在比较之前对索引进行排序,尝试像这样更改实现:

    A = []
    B = []
    
    for df in (a,b,c,d):
        if ((df.sort_index(inplace=True) == a.sort_index(inplace=True)) | (df.sort_index(inplace=True) == b.sort_index(inplace=True))):
            k = 1
            A.append(k)
        elif ((df.sort_index(inplace=True) == c.sort_index(inplace=True)) | (df.sort_index(inplace=True) == d.sort_index(inplace=True))):
            k = 2
            B.append(k)
    

    【讨论】:

    • 我试过你的代码,它似乎工作了一半。没有错误消息,但它似乎只选择了一个条件,因为输出是:[1, 1, 1, 1] [ ] 并且预期的答案应该是 [1, 1] [2, 2]
    • 那是因为 b、c 和 d 实际上是相同的。尝试更改值,使 b、c 和 d 的值不同
    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2018-03-07
    • 2016-07-21
    • 1970-01-01
    • 2023-04-05
    • 2018-03-17
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多