熊猫-如果列值在列表(.csv)中,则从数据框中删除行

时间:2020-08-06 14:52:36

标签: python pandas dataframe csv

我有一个从SQL导入的pandas数据帧,我想删除列值在列表中的行,这些行是从csv文件获得的。似乎很简单,我查了一下,然后使用.isin()尝试了几件事,但这没有按我预期的那样工作。

例如,从SQL导入的数据帧如下所示,我们将其称为df:

    SKU        Brand
0  AD31KL-A1   BrandA
1  BC31KL-B3   BrandB
2  DE31KL-D4   BrandC
3  FG31KL-F5   BrandD

我以这种方式导入此列表:

df2 = pd.read_csv("list.csv")
list = df2.apply(lambda x: x.tolist(), axis=1)

假设我打印了列表,这就是我看到的内容:

[BC31KL-B3]
[DE31KL-D4]
Length: 2, dtype: object

然后我使用以下内容:

df = df[~df.SKU.isin(list)]

我希望得到这个(由于第1行和第2行在列表中,因此删除了初始df)

    SKU        Brand
0  AD31KL-A1   BrandA
3  FG31KL-F5   BrandD

但是这不会发生。我得到了与最初完全相同的df,没有掉线,也没有任何错误消息。我在做什么错了?
我认为列表和df列中的数据可能不是同一类型,因此我尝试摆弄astype(),但没有成功。也许我用错了。

非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

这行似乎是您的问题:

list = df2.apply(lambda x: x.tolist(), axis=1)

应用df的结果是另一个df。假设.csv文件有一个称为SKU的列。您只能从该列中列出一个清单:

list = df2['SKU'].tolist()

以下示例代码显示只需将列/系列上的tolist()调用即可将一列值转换为列表:

# Well, I don't have list.csv, so let me just create a dataframe
df = pd.DataFrame( ['AD31KL-A1','BC31KL-B3','DE31KL-D4','FG31KL-F5' ], columns = ['SKU'] )
print(df)
list =  df['SKU'].tolist() 
print( list ) 

这是代表list.csv的d​​f:

         SKU
0  AD31KL-A1
1  BC31KL-B3
2  DE31KL-D4
3  FG31KL-F5

这是列表:

['AD31KL-A1', 'BC31KL-B3', 'DE31KL-D4', 'FG31KL-F5']

最后,如果您没有列名,则只需按其整数值即可获取第一列:

df = pd.DataFrame( ['AD31KL-A1','BC31KL-B3','DE31KL-D4','FG31KL-F5' ] )
print(df)
list =  df.iloc[:, 0].tolist()  # first column of dataframe
print( list )