通过dict传入参数或理解列表python pandas

时间:2017-05-29 11:12:51

标签: python-3.x pandas dataframe

我想在数据框中选择传递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

有人知道如何自动选择列表对应的行吗?

谢谢你回答,

克里斯。

1 个答案:

答案 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