提取/附加pandas数据帧行,满足涉及多列

时间:2015-10-14 23:42:12

标签: python pandas filter conditional-statements

我无法理解循环数据框的工作原理。

如果你写的话,我找到了某个地方:

for row in df.iterrows()

您将无法访问行[' column1'],而您必须使用

for row,index in df.iterrows()然后就可以了。

现在我想创建一个我在循环中找到的信号集合,通过向新数据帧添加行newdf.append(row)这可以工作,但它失去了字符串引用的能力。我如何将这些行添加到我的数据框中以使其起作用?

详细代码:

dataframe1 = DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
dataframe2 = DataFrame()

for index,row in dataframe1:
   if row['a'] == 5
       dataframe2.append(row)

print dataframe2['b']

这不起作用,因为他不接受数据框2的括号内的字符串。 是的,这可以做得更容易,但是为了争论,我们可以说它不能(逻辑比一个更复杂)。

在我的真实代码中,有十个不同的ifs和elses决定如何处理该特定行(并在循环中执行其他操作)。我不是在谈论过滤,而只是以一种保护索引的方式将行添加到新数据框中,以便我可以使用列的名称进行引用

2 个答案:

答案 0 :(得分:2)

pandas中,过滤并将结果(如果需要)传递给新数据帧非常简单,就像@smci建议r一样。

import numpy as np
import pandas as pd

dataframe1 = pd.DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
dataframe1.head()

          a         b         c         d         e
0 -2.824391 -0.143400 -0.936304  0.056744 -1.958325
1 -1.116849  0.010941 -1.146384  0.034521 -3.239772
2 -2.026315  0.600607  0.071682 -0.925031  0.575723
3  0.088351  0.912125  0.770396  1.148878  0.230025
4 -0.954288 -0.526195  0.811891  0.558740 -2.025363

然后,要进行过滤,您可以这样做:

dataframe2=dataframe1.ix[dataframe1.a>.5]
dataframe2.head()

         a         b         c         d         e
0  0.708511  0.282347  0.831361  0.331655 -2.328759
1  1.646602 -0.090472 -0.074580 -0.272876 -0.647686
8  2.728552 -0.481700  0.338771  0.848957 -0.118124

修改

OP不想使用过滤器,所以这里是一个迭代遍历行的示例:

np.random.seed(123)
dataframe1 = pd.DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
## I declare the second df with the same structure
dataframe2 = pd.DataFrame(columns=['a','b','c', 'd', 'e'])

对于循环我使用iterrows,而不是append到空数据帧,我使用迭代器中的索引放置在空帧的相同索引位置。请注意,我说的是> .5而不是= 5,否则结果数据框肯定是空的。

for index, row in dataframe1.iterrows():
    if row['a'] > .5:

        dataframe2.loc[index] =  row

dataframe2

          a         b         c         d         e
1  1.651437 -2.426679 -0.428913  1.265936 -0.866740
4  0.737369  1.490732 -0.935834  1.175829 -1.253881

答案 1 :(得分:0)

更新:

不要。解决方案是:

dataframe1[dataframe1.a > .5]
# or, if you only want the 'b' column
dataframe1[dataframe1.a > .5] ['b']

您只想过滤a == 5的行(然后选择b列?) 您仍然没有显示为什么需要追加到dataframe1的原因。事实上,您不需要附加任何内容,只需直接生成过滤后的版本。

原始版本:

<强>唐&#39;吨

如果您只想计算聚合或摘要,并且它们并非真正属于父数据框,请执行过滤。将结果分配给单独的数据帧。

如果你真的坚持使用iterate + append,而不是过滤器,甚至知道所有警告,那么创建一个空的摘要数据框,然后在迭代时附加到该数据框。只有在您完成迭代后,才将其附加(并且仅在您确实需要时),返回到父数据帧。