如何选择行中至少一个元素中包含特定值的行?

时间:2016-05-14 18:59:27

标签: python python-3.x pandas

我有一个DataFrame DF和一个列表,比如List1List1是根据DF创建的,DF中包含元素,但没有重复。我需要做以下事项:
1.从DF中选择包含特定元素的List1行(例如,迭代List1中的所有元素)
2.将它们从0重新索引到任何行数,因为所选行可能具有非连续索引。

示例输入:

List1=['Apple','Orange','Banana','Pineapple','Pear','Tomato','Potato']
Sample DF
  EQ1      EQ2      EQ3
0 Apple    Orange   NaN
1 Banana   Potato   NaN
2 Pear     Tomato   Pineapple
3 Apple    Tomato   Pear
4 Tomato   Potato   Banana

现在,如果我想访问包含Apple的行,那么它们将是0和3.但我希望它们重命名为0和1(重新索引)。搜索Apple后,应采用List1中的下一个元素,并执行类似的步骤。在此之后我还要执行其他操作,因此我需要在整个List1中循环整个过程。我希望我已经解释得很好,这是我的同样的小码,这是行不通的:

for eq in List1:
    MCS=DF.loc[MCS_Simp_green[:] ==eq] #Indentation was missing
    MCS= MCS.reset_index(drop=True)
    <Remaining operations>

2 个答案:

答案 0 :(得分:3)

我认为isin需要any

List1=['Apple','Orange','Banana','Pineapple','Pear','Tomato','Potato']

for eq in List1:
    #print df.isin([eq]).any(1)
    #print df[df.isin([eq]).any(1)]
    df1 = df[df.isin([eq]).any(1)].reset_index(drop=True)  
    print df1

     EQ1     EQ2   EQ3
0  Apple  Orange   NaN
1  Apple  Tomato  Pear
     EQ1     EQ2  EQ3
0  Apple  Orange  NaN
      EQ1     EQ2     EQ3
0  Banana  Potato     NaN
1  Tomato  Potato  Banana
    EQ1     EQ2        EQ3
0  Pear  Tomato  Pineapple
     EQ1     EQ2        EQ3
0   Pear  Tomato  Pineapple
1  Apple  Tomato       Pear
      EQ1     EQ2        EQ3
0    Pear  Tomato  Pineapple
1   Apple  Tomato       Pear
2  Tomato  Potato     Banana
      EQ1     EQ2     EQ3
0  Banana  Potato     NaN
1  Tomato  Potato  Banana

对于存储值,您可以使用dict理解:

dfs = {eq: df[df.isin([eq]).any(1)].reset_index(drop=True) for eq in List1}

print dfs['Apple']
     EQ1     EQ2   EQ3
0  Apple  Orange   NaN
1  Apple  Tomato  Pear

print dfs['Orange']
     EQ1     EQ2  EQ3
0  Apple  Orange  NaN

答案 1 :(得分:2)

您可以识别list中的项目并收集生成的新DataFrame,如下所示:

data_frames = {}
for l in List1:
    data_frames[l] = df[df.isin([l]).any(1)].reset_index(drop=True)
    print(l, data_frames[l].index.tolist())

得到:

Apple [0, 1]
Orange [0]
Banana [0, 1]
Pineapple [0]
Pear [0, 1]
Tomato [0, 1, 2]
Potato [0, 1]

DataFrame个对象包含在dictionary data_frames中:

data_frames['Apple']

     EQ1     EQ2   EQ3
0  Apple  Orange   NaN
1  Apple  Tomato  Pear