迭代pandas数据帧

时间:2016-02-06 01:45:22

标签: python pandas indexing iterator dataframe

我正在尝试迭代我拥有的数据帧并使用单元格内部的值,但我需要使用单元格来自的列和行的名称。因此,我目前正在做类似以下的事情:

df=pandas.DataFrame(data={"C1" : [1,2,3,4,5], "C2":[1,2,3,4,5]}, 
                    index=["R1","R2","R3","R4","R5"])
for row in df.index.values:
    for column in df.columns.values:
       if (df[row][column] > 3:
           if row in df2[column]:
              print("data is present")

我需要使用行名和列名,因为我使用它们在另一个具有相关信息的数据框中查找值。我知道for循环永远占用了pandas,但是我还没有找到任何关于如何迭代行和列并同时进行迭代的示例。这个:

df.applymap()

不会工作,因为它只提供单元格中的值,而不保留对单元格所在的行和列的引用,并且:

df.apply(lambda row: row["column"])

不会工作,因为我需要在不知道之前获取列的名称。还有这个:

df.apply(lambda row: someFunction(row))

不会工作,因为apply使用的Series对象只有行名,而不是行名和列名。

任何见解都会有所帮助!我目前正在运行for循环版本,但它需要永远,并且还会占用CPU内核。

1 个答案:

答案 0 :(得分:1)

import pandas as pd

df = pd.DataFrame(data={"C1": [1, 2, 3, 4, 5], 
                        "C2": [1, 2, 3, 4, 5]}, 
                  index=["R1", "R2", "R3", "R4", "R5"])
df2 = pd.DataFrame({'R3': [1], 'R5': [1], 'R6': [1]})

要从df2获取df中值大于3的所有相应列,可以使用条件列表推导:

>>> [idx for idx in df[df.gt(3).any(axis=1)].index if idx in df2]
['R5']

要了解其工作原理:

>>> df.gt(3)
       C1     C2
R1  False  False
R2  False  False
R3  False  False
R4   True   True
R5   True   True

然后我们想要任何行的索引,其值大于3:

df.gt(3).any(axis=1)
Out[23]: 
R1    False
R2    False
R3    False
R4     True
R5     True
dtype: bool

>>> df[df.gt(3).any(axis=1)]
    C1  C2
R4   4   4
R5   5   5

>>> [i for i in df[df.gt(3).any(axis=1)].index]
['R4', 'R5']

>>> [i for i in df[df.gt(3).any(axis=1)].index if i in df2]
['R5']