空数据框,用字典过滤数据框
Posted
技术标签:
【中文标题】空数据框,用字典过滤数据框【英文标题】:empty dataframe, filtering dataframe with dictionary 【发布时间】:2020-11-24 18:57:23 【问题描述】:我有一个数据框,我需要遍历它来识别与键值对不匹配的行。所有键都是不同的,但值可能会重复。
当我使用在循环之外工作的代码时,它会生成一个空数据框。我已经确认应该包含一些行(数据框中存在键和值)。
一些示例代码:
df = pd.DataFrame(np.random.randint(5,10,size=(15, 4)), columns=list('ABCD'))
dept = 7: [5], 8: [7], 5: [9, 10], 9: [9]
nd = pd.DataFrame()
for key, value in dept.items():
f = df.loc[df['A']==key, :]
ff = f.loc[~f['B'].isin(value), :]
print(type(ff))
print(ff.shape)
nd.append(ff)
print(nd)
我收到以下输出:
<class 'pandas.core.frame.DataFrame'>
(4, 4)
<class 'pandas.core.frame.DataFrame'>
(1, 4)
<class 'pandas.core.frame.DataFrame'>
(2, 4)
<class 'pandas.core.frame.DataFrame'>
(1, 4)
Empty DataFrame
Columns: []
Index: []
由于形状是准确的,我相信这与
我搜索了堆栈溢出的高低,但没有找到这种类型的示例。感谢您的帮助!
【问题讨论】:
【参考方案1】:尝试连接:
nd = pd.DataFrame()
for key, value in dept.items():
f = df.loc[df['A']==key, :]
ff = f.loc[~f['B'].isin(value), :]
print(type(ff))
print(ff.shape)
frames = [nd, ff]
nd = pd.concat(frames)
print(nd)
【讨论】:
【参考方案2】:另一种选择是使用 series.map()
,然后使用 df.query()
过滤
(df.assign(E=df['A'].map(dept)).dropna(subset=['E']).explode('E').query("B!=E")
.drop("E",1).drop_duplicates())
A B C D
2 9 6 7 6
5 8 9 7 5
6 8 5 7 5
8 9 8 9 8
10 7 7 7 5
11 5 5 8 7
12 9 7 8 8
13 9 6 8 8
14 9 6 9 9
【讨论】:
以上是关于空数据框,用字典过滤数据框的主要内容,如果未能解决你的问题,请参考以下文章