我是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新手的任何指导都会非常感激。
答案 0 :(得分:2)
我认为您需要使用DataFrame
构造函数numpy.setdiff1d
:
df1 = pd.DataFrame({'all_days': np.setdiff1d(day_list, df['days'])})
print(df1)
all_days
0 saturday
1 sunday
另一个解决方案是将列表转换为像Series
或DataFrame
这样的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