比较Excel单元格Python

2024-05-15 21:17:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

示例: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列读取提及部分的值的代码部分可能是:

^{pr2}$

有什么提示吗?在

更新

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

华金的例子:

   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。你知道怎么回事吗?在

非常感谢, 丹


Tags: innone元素dataframedfforifsheet
1条回答
网友
1楼 · 发布于 2024-05-15 21:17:05

鉴于你的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

然后,我将C1C3C1C2

^{pr2}$

并比较列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个匹配项,并且需要从最终输出中删除复制项)。在

相关问题 更多 >