将两个pandas数据帧单元格与单元格进行比较

时间:2018-04-03 06:02:09

标签: python python-3.x pandas

我是数据科学的新手,我想检查数据框中哪个元素存在于另一个数据框中。

例如:

df1 = [1,2,8,6] df2 = [5,2,6,9]

输出的

应为False

2输出的

应为True

输出的

应为True

等..

注意: - 我有矩阵而不是矢量。

我尝试使用以下代码:

将pandas导入为pd 导入numpy为np

priority_dataframe = pd.read_excel(prioritylist_file_path, sheet_name='Sheet1', index=None)

priority_dict = {column: np.array(priority_dataframe[column].dropna(axis=0, how='all').str.lower()) for column in
                     priority_dataframe.columns}
keys_found_per_sheet = []
if file_path.lower().endswith(('.csv')):
    file_dataframe = pd.read_csv(file_path)
else:
    file_dataframe = pd.read_excel(file_path, sheet_name=sheet, index=None)

file_cell_array = list()
for column in file_dataframe.columns:
    for file_cell in np.array(file_dataframe[column].dropna(axis=0, how='all')):
        if isinstance(file_cell, str) == 'str':
            file_cell_array.append(file_cell)
        else:
            file_cell_array.append(str(file_cell))

converted_file_cell_array = np.array(file_cell_array)

for key, values in priority_dict.items():
    for priority_cell in values:
        if priority_cell in converted_file_cell_array[:]:
            keys_found_per_sheet.append(key)
            break

我在if priority_cell in converted_file_cell_array[:]做错了什么?

还有其他有效的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以按numpy.ravel展平DataFrame的所有值,然后使用set.intersection()

df1 = pd.DataFrame({'A':list('abcdef'),
                   'B':[4,5,4,5,5,4],
                   'C':[7,8,9,4,2,3],
                   'D':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4],
                   'F':list('aaabbb')})

print (df1)
   A  B  C  D  E  F
0  a  4  7  1  5  a
1  b  5  8  3  3  a
2  c  4  9  5  6  a
3  d  5  4  7  9  b
4  e  5  2  1  2  b
5  f  4  3  0  4  b

df2 = pd.DataFrame({'A':[2,3,13,4], 'Z':list('abfr')})
print (df2)
    A  Z
0   2  a
1   3  b
2  13  f
3   4  r

L = list(set(df1.values.ravel()).intersection(df2.values.ravel()))
print (L)
['f', 2, 3, 4, 'a', 'b']

答案 1 :(得分:2)

您可以从每个数据框中获取.values,将其转换为set(),然后选择设置的交叉点。

set1 = set(df1.values.reshape(-1).tolist())
set2 = set(dr2.values.reshape(-1).tolist())
different = set1 & set2