我想从数据框df
中选择行,其中许多列中的任何列都包含列表my_list
中的值。有几十个列,将来可能还会有更多列,所以我不想遍历列表中的每个列。
我不想要:
# for loop / iteration
for col in df.columns:
df.loc[df[col].isin(my_list), "indicator"] = 1
也不是:
# really long indexing
df = df[(df.col1.isin(my_list) | (df.col2.isin(my_list) | (df.col3.isin(my_list) ... (df.col_N.isin(my_list)] # ad nauseum
我也不希望将数据框从宽格式改成长格式。
我正在考虑(希望)有一种方法可以一次完成此操作,一次将isin()
应用于许多列。
谢谢!
答案 0 :(得分:2)
您可以使用DataFrame.isin(),它是一种DataFrame方法,而不是字符串方法。
new_df = df[df.isin(my_list)]
答案 1 :(得分:2)
或者,您可以尝试:
df[df.apply(lambda x: x.isin(mylist)).any(axis=1)]
OR
df[df[df.columns].isin(mylist)]
即使不是非常必要,也不需要创建列表,而是直接按如下所示分配列表。
df[df[df.columns].isin([3, 12]).any(axis=1)]
检查您的努力后:
>>> df
col_1 col_2 col_3
0 1 1 10
1 2 4 12
2 3 7 18
>>> mylist
[3, 12]
>>> df[df.col_1.isin(mylist) | df.col_2.isin(mylist) | df.col_3.isin(mylist)]
col_1 col_2 col_3
1 2 4 12
2 3 7 18
>>> df[df.isin(mylist).any(axis=1)]
col_1 col_2 col_3
1 2 4 12
2 3 7 18
或:
>>> df[df[df.columns].isin(mylist).any(axis=1)]
col_1 col_2 col_3
1 2 4 12
2 3 7 18
或:
>>> df[df.apply(lambda x: x.isin(mylist)).any(axis=1)]
col_1 col_2 col_3
1 2 4 12
2 3 7 18