比较Excel单元格Python



我想比较 Excel 文件中具有不同元素数量的两个不同列的两个部分。应在第 3 列的一部分和第 2 列的一部分之间进行比较。第 3 列部分的长度为 j 个元素,第 2 列的长度为 k 个元素 (k>j)。第 2 列部分从行"j+1"开始,第 3 列部分从第 1 行开始。如果第 3 列部分中的元素与第 2 列部分中的元素匹配,则应检查第 1 列中的元素,在与第 3 列部分中的匹配项目具有相同索引的 j 行之前是否与 j+1 和 k 之间的第 1 列部分中的元素匹配,该元素与第 2 列部分中的匹配项目具有相同的索引。如果是,则应将第 4 列中的元素写入新的 Excel 工作表中,该元素的索引与第 2 列部分中的匹配元素相同。

示例:Column3[1]==Column2[2](表示元素"A")=>Column1[1]==Column1[j+2](表示元素"P")=>Column4[j+2]应写入新工作表中。

Column 1 Column 2 Column 3 Column 4
P         F        A          S
B         G        X          T
C         H        K          V
D         I        M          W
P         B        R          B
P         A        R          D
C         D        H          E
D         E        J          k
E         M        K          W
F         F        L          Q
Q         F        K          Q

为了从原始工作表中读取Excel工作表单元格,我使用了df27.ix[:j-1,1]

从第 3 列和第 2 列读取提及部分值的代码的一部分可能是:

for j in range(1,j):
c3=sheet['B'+str(j)].value
for k in range(j,j+k):
c2=sheet['B'+str(k)].value

任何提示我如何做到这一点?

更新

我尝试了一个新的代码,它考虑到我们有"-",就像华金在他的例子中提到的那样。

华金的例子:

C1  C2  C3  C4
0   P   -   A   -
1   B   -   X   -
2   C   -   K   -
3   D   -   M   -
4   P   B   -   B
5   P   A   -   D
6   C   D   -   E
7   D   E   -   k
8   E   M   -   W
9   F   F   -   Q
10  Q   F   -   Q

新代码:

from pandas import DataFrame as df
import pandas as pd
import openpyxl
wb=openpyxl.load_workbook('/media/sf_vboxshared/x.xlsx')
sheet=wb.get_sheet_by_name('Sheet1')
C13=[]
C12=[]
C1=[]
C2=[]
C3=[]
for s in range(2, sheet.max_row+1):
C1second=sheet['A'+str(s)].value
C2second=sheet['B'+str(s)].value
C3second=sheet['C'+str(s)].value
C1.append(C1second)
C2.append(C2second)
C3.append(C3second)
C1=[x.encode('UTF8') for x in C1]
for y in C2:
if y is not None:
C2=[x.encode('UTF8') if x is not None else None for x in C2]
for z in C3:
if z is not None:
C3=[x.encode('UTF8') if x is not None else None for x in C3]
for x in C1:
C13.append(x)
for x in C3:
C13.append(x)
for x in C1:
C12.append(x)
for x in C2:
C12.append(x)
tosave = pd.DataFrame()
df[C13]=pd.DataFrame(C13)
df[C12]=pd.DataFrame(C12)
for item in df[C13]:
if '-' in item: continue
new = df[df[C12] == item]
tosave = tosave.append(new)

但我仍然收到以下错误:df[C13]=pd.DataFrame(C13) TypeError: 'type' object does not support item assignment.知道出了什么问题吗?

提前非常感谢, 担

鉴于您的 df 是

C1  C2  C3  C4
0   P   -   A   -
1   B   -   X   -
2   C   -   K   -
3   D   -   M   -
4   P   B   -   B
5   P   A   -   D
6   C   D   -   E
7   D   E   -   k
8   E   M   -   W
9   F   F   -   Q
10  Q   F   -   Q

然后,我将 C1 和C3以及C1C2结合起来

df['C13'] = df.apply(lambda x: x['C1'] + x['C3'], axis=1)
df['C12'] = df.apply(lambda x: x['C1'] + x['C2'], axis=1)

并比较哪些行在C13C12列中具有相同的字符对,并将它们保存在tosave

tosave = p.DataFrame()
for item in df['C13']:
if '-' in item: continue
new = df[df['C12'] == item]
tosave = tosave.append(new)

这为您提供了一个行匹配的tosave数据帧:

C1   C2  C3  C4  C13 C12
5   P   A   -   D   P-  PA 

可以直接按原样保存,也可以只保存C4列

更新:如果每行都有数据,则不能使用"-"检测(或基于空列和填充列之间的差异的任何其他类型的检测)。另一方面,如果没有定义j,k(对于任何j和k),你的问题实际上被简化为在每一行下找到相同的对。在承认中,这是:

tosave = p.DataFrame()
for idx, item in enumerate(df['C13']):
new = df[df['C12'] == item]
tosave = tosave.append(new.loc[idx+1:])

根据标签和数据解决的问题如下:

C1  C2  C3  C4
0   P   F   A   S
1   B   G   X   T
2   C   H   K   V
3   D   I   M   W
4   P   B   R   B
5   P   A   R   D
6   C   D   H   E
7   D   E   J   k
8   E   M   K   W
9   F   F   L   Q
10  Q   F   K   Q

此代码还生成与以前相同的输出:

C1   C2  C3  C4  C13 C12
5   P   A   R   D   PR  PA

请注意,这可能需要一些优化(例如,当一行产生 2 个匹配项时,第二行产生 1 个匹配项,您将需要从最终输出中删除重复项)。

最新更新