使用pandas dataframe.query查找相同的行

时间:2018-11-08 13:50:29

标签: python pandas

我有一个约有13列的excel工作表,它将用作某些数据提取过程的索引文件。列之一指示要提取的文件是新文件还是之前已经被提取的文件。 (是还是不是)。 为了说一个新文件以前是否被摄取过,我需要检查三个特定列的值是否与索引文件中的任何其他条目相同。

也就是说,

假设我摄取了文件Data.xlsx,它具有文件名,文件路径,访问时间和其他一些属性。现在,我需要检查索引文件,以说是否还有其他文件具有相同的文件名,文件路径和对此文件的访问时间。

到目前为止,我的策略是使用熊猫将索引文件写入数据帧。然后,我的意图是除去文件名,文件路径和访问时间之外的所有其他列。然后将数据添加到我的新摄取文件中,并检查其是否与任何其他行匹配。

我正在寻求有关这是否是最好的做事方式以及如何执行此操作的帮助。

谢谢

明智的方法,我正在尝试创建此方法:

def neworold(self):
    df = pd.read_excel(self.index_path)
    df.duplicated() 

当我摄取文件时,它会更新我的提交对象的index_data属性。此方法将读取索引数据(当前,包含大约13个条目的列表,表示不同列中的值),读取excel索引文件路径,如果已重复,则输出True,如果没有重复,则输出false。 / p>

然后将该值附加到用于设置index_data的方法和用于将索引数据写入索引文件的方法中

def update_index_sheet(self):
    wb = load_workbook(self.index_path)
    wb.active = 0
    for k in self.index_data:
        wb.active.append(k)

1 个答案:

答案 0 :(得分:0)

对于假设的DataFrame:

df
   access_time fn path
0            2  a    f
1            9  b    g
2            5  c    h
3            5  d    i
4            9  e    j

我将使用具有列名作为关键字的字典,因为这明确说明了哪个值应与哪一列匹配

# in DataFrame
a = {'access_time': 2, 'fn': 'a', 'path': 'f'}
# not in DataFrame
b = {'access_time': 3, 'fn': 'a', 'path': 'f'}

def file_in_index(index, file_attrs):
    """Return True if all attributes of a file are found in a single row, otherwise False

    Parameters
    ----------
    index : pandas.DataFrame
        Your index DataFrame
    file_attrs: dict
        A dictionary of key:value pairs matching column_names:file_value

    Returns
    -------
    bool
        True if no matching rows are found
    """
    if index[index['access_time'].eq(file_attrs['access_time']) &
             index['fn'].eq(file_attrs['fn']) &
             index['path'].eq(file_attrs['path'])].empty:
        return False
    else:
        return True

file_in_index(df, a)
True
file_in_index(df, b)
False

这通过搜索查找您在单行中列出的所有条件而起作用;如果搜索返回一个空的DataFrame,则没有行符合您的所有条件。