Python 如何从数据帧中删除不在列表中的某些值?
通过编写以下代码,我创建了一个数据帧Python 如何从数据帧中删除不在列表中的某些值?,python,pandas,numpy,Python,Pandas,Numpy,通过编写以下代码,我创建了一个数据帧 data = [['A', 'B','D'], ['A','D'], ['F', 'G','C','B','A']] df = pd.DataFrame(data) df 我的目标是从数据帧中删除不在下面列表中的值 list_items = ['A','B','C'] 我的预期产出如下所示 我曾尝试遍历循环中的值并逐个检查,但假设数据帧的大小非常大,为91081616,列表中有130多个项目需要检查。在这种情况下,运行代码的时间太长。请建议实现预期输
data = [['A', 'B','D'], ['A','D'], ['F', 'G','C','B','A']]
df = pd.DataFrame(data)
df
我的目标是从数据帧中删除不在下面列表中的值
list_items = ['A','B','C']
我的预期产出如下所示
我曾尝试遍历循环中的值并逐个检查,但假设数据帧的大小非常大,为91081616,列表中有130多个项目需要检查。在这种情况下,运行代码的时间太长。请建议实现预期输出的最有效方法。我不认为在熊猫中这样做是一个好主意,因为专栏在这里并不重要。使用列表更容易,如果您真的需要,最终可以将其转换为数据帧
# convert df to list of lists
data = df.values.tolist()
# filter each element of the list to contain only list_items values
data_filtered = [ [el for el in l if el in list_items] for l in data]
# convert back to dataframe
df_filtered = pd.DataFrame(data_filtered)
print(df_filtered)
# 0 1 2
#0 A B None
#1 A None None
#2 C B A
让我们试着不要使用for循环
s=df.where(df.isin(list_items)).reset_index().melt('index').dropna()
s=s.assign(Key=s.groupby('index').cumcount()).pivot('index','Key','value')
Key 0 1 2
index
0 A B NaN
1 A NaN NaN
2 C B A
方法二不适合大数据帧
s=df.where(df.isin(list_items)).T.apply(lambda x : sorted(x,key=pd.isnull)).T.dropna(thresh=1, axis=1)
0 1 2
0 A B NaN
1 A NaN NaN
2 C B A
是什么决定了行数和列数的变化方式?