我有一个DataFrame
DF
和一个列表,比如List1
。 List1
是根据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>
答案 0 :(得分:3)
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