将列表中的值缺失到Python 3.x中的新数据框中

时间:2018-01-07 11:27:03

标签: python pandas dataframe subset

我是python的新手。我正在尝试使用列表中的值来从pandas数据框中对数据进行子集化。以下是我想要做的一个简单示例。

import pandas as pd

# Create dataframe df which contains only one column having weekdays as values
df = pd.DataFrame({'days':['monday','tuesday','wednesday','thursday','friday']})

# A list containing all seven days of a week
day_list = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday']

# Create a new dataframe which should contain values present in list but missing in dataframe
df1 = df[~df.days.isin(day_list)]

# Output shows empty dataframe
Empty DataFrame
Columns: [days]
Index: []

# This gives error
df2 = df[~day_list.isin(df.days)]

# output from df2 code execution
df2 = df[~day_list.isin(df.days)]
AttributeError: 'list' object has no attribute 'isin'

在R中,我可以使用以下条件轻松获得此结果。

# Code from R
df1 <- day_list[! (day_list %in% df$days), ]

我想创建一个新的数据框,其中仅包含列表day_list中但不存在于df.days中的那些值。在这种情况下,它应该返回星期六&#39;和&#39;星期日&#39;作为输出。我怎样才能得到这个结果?我已经看过这个帖子中提供的解决方案 - How to implement 'in' and 'not in' for Pandas dataframe。但它并没有解决我的问题。对Python 3.x新手的任何指导都会非常感激。

1 个答案:

答案 0 :(得分:2)

我认为您需要使用DataFrame构造函数numpy.setdiff1d

df1 = pd.DataFrame({'all_days': np.setdiff1d(day_list, df['days'])})
print(df1)
   all_days
0  saturday
1    sunday

另一个解决方案是将列表转换为像SeriesDataFrame这样的pandas结构并使用isin

s = pd.Series(day_list)
s1 = s[~s.isin(df['days'])]

print(s1)
5    saturday
6      sunday
dtype: object
df2 = pd.DataFrame({'all_days': day_list})
df1 = df2[~df2['all_days'].isin(df['days'])]
print(df1)
   all_days
5  saturday
6    sunday