【问题标题】: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: []

由于形状是准确的,我相信这与 类型有关。如何从这种类型中提取我的数据框?

我搜索了堆栈溢出的高低,但没有找到这种类型的示例。感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe loops dictionary


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2021-04-28
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        • 2023-01-13
        相关资源
        最近更新 更多