我想在数据框中选择传递dict或理解列表的行。
我有一个包含数百万行的数据框,我想创建一个函数,只选择与参数列表对应的数据帧的一部分。为了使其复杂化,我必须传递数据框和列表,但此列表可以包含NaN值和' 0'。所以我必须删除此条目以选择正确的行。
条目清单:
b = ['MUSTANG', 'Coupé', '0', np.nan, np.nan]
AGE KM Brand Model Liter Bodycar Power
0 2.0 10000.0 FORD MUSTANG 5.0 Coupé 421
1 2.0 10000.0 FORD MUSTANG 5.0 Coupé 421
2 5.0 10400.0 FORD MUSTANG 5.0 Coupé 421
3 5.0 10400.0 FORD MUSTANG 5.0 Coupé 421
4 16.0 20700.0 FORD MUSTANG 3.7 Coupé 317
5 7.0 23300.0 FORD MUSTANG 3.7 317
6 7.0 23300.0 FORD MUSTANG 2.3 Coupé 301
7 7.0 23300.0 FORD MUSTANG 5.0 421
...
I started a function to remove the part of the list useless and try to select the proper rows but failed...
def func_mcclbp_incomp(df, mcclbp):
ind = []
mcclbp = [i if type(i) == str else '0' for i in mcclbp]
ind = [i for i, x in enumerate(mcclbp) if x=='0']
head = ['Brand','Model','Bodycar','Liter', 'Power']
mmcclbp = {head[0]:mcclbp[0], head[1]:mcclbp[1], head[2]:mcclbp[2], \
head[3]:mcclbp[3], head[4]:mcclbp[4]}
for i in ind:
del mmcclbp[head[i]]
df = df[df[head[i]==mccblp[i]] for i in mmcclbp.key()]
return df
我尝试了一个理解列表,但是pandas给我发了一个错误:
File "<ipython-input-235-6f78e45f59d4>", line 1
df = df[df[head[i].isin(mccblp[i]) for i in mmcclbp.keys()]]
^
SyntaxError: invalid syntax
当我尝试传递dict时,我有一个KeyError。
如果我使用b,则需要输出:
AGE KM Brand Model Liter Bodycar Power
0 2.0 10000.0 FORD MUSTANG 5.0 Coupé 421
1 2.0 10000.0 FORD MUSTANG 5.0 Coupé 421
2 5.0 10400.0 FORD MUSTANG 5.0 Coupé 421
3 5.0 10400.0 FORD MUSTANG 5.0 Coupé 421
4 16.0 20700.0 FORD MUSTANG 3.7 Coupé 317
6 7.0 23300.0 FORD MUSTANG 2.3 Coupé 301
如果我将b更改为另一个值,如:
b = ['FORD', 'MUSTANG', 'Coupé', '3.7', '317']
结果将是:
AGE KM Brand Model Liter Bodycar Power
4 16.0 20700.0 FORD MUSTANG 3.7 Coupé 317
有人知道如何自动选择列表对应的行吗?
谢谢你回答,
克里斯。
答案 0 :(得分:1)
您可以dict
使用DataFrame.all
进行过滤,以检查每行的所有True
值,并按boolean indexing
进行过滤。
还需要将DataFrame
的所有值转换为string
astype
,因为values
的所有dict
也是string
:
d = {'Brand':'FORD', 'Model':'MUSTANG', 'Bodycar':'Coupé', 'Liter':'3.7', 'Power':'317'}
print (df.astype(str)[list(d)] == pd.Series(d))
Bodycar Brand Liter Model Power
0 True True False True False
1 True True False True False
2 True True False True False
3 True True False True False
4 True True True True True
6 True True False True False
mask = (df.astype(str)[list(d)] == pd.Series(d)).all(axis=1)
print (mask)
0 False
1 False
2 False
3 False
4 True
6 False
dtype: bool
df1 = df[mask]
print (df1)
AGE KM Brand Model Liter Bodycar Power
4 16.0 20700.0 FORD MUSTANG 3.7 Coupé 317