Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Excel单元格与Python_Python_Excel - Fatal编程技术网

比较Excel单元格与Python

比较Excel单元格与Python,python,excel,Python,Excel,我想比较Excel文件中两个不同列的两部分,它们的元素数不同。应在第3列的一部分和第2列的一部分之间进行比较。第3列零件的长度为j个元素,第2列的长度为k个元素(k>j)。第2列零件从“j+1”行开始,第3列零件从第1行开始。如果第3列零件中的一个元素与第2列零件中的一个元素匹配,则应检查j行之前第1列的元素(其索引与第3列零件中的匹配项相同)是否与第1列零件中的元素(其索引与第2列零件中的匹配项相同)匹配。如果是,则应将第4列中的元素与第2列中匹配元素的索引写入新的Excel工作表中 示例:C

我想比较Excel文件中两个不同列的两部分,它们的元素数不同。应在第3列的一部分和第2列的一部分之间进行比较。第3列零件的长度为j个元素,第2列的长度为k个元素(k>j)。第2列零件从“j+1”行开始,第3列零件从第1行开始。如果第3列零件中的一个元素与第2列零件中的一个元素匹配,则应检查j行之前第1列的元素(其索引与第3列零件中的匹配项相同)是否与第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列读取提及部分值的代码的一部分可能是:

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
有什么提示我可以做到这一点吗

已更新

df['C13'] = df.apply(lambda x: x['C1'] + x['C3'], axis=1)
df['C12'] = df.apply(lambda x: x['C1'] + x['C2'], axis=1)
我尝试了一个新的代码,它考虑到我们有“-”,就像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'对象不支持项分配
。你知道怎么了吗

多谢各位, Dan

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

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 = p.DataFrame()

for item in df['C13']:
    if '-' in item: continue
    new = df[df['C12'] == item]
    tosave = tosave.append(new)
这将为您提供一个
保存
数据框,其中的行匹配:

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

可能有帮助您只需要找到与对(c1,c2)相同的对(c1,c3)。在这种情况下,只有一对('P','A')符合条件。只需使用pandas:
df=P读取excel文件。读取excel(您的文件路径)
,然后从那里开始。第一:阅读文档,了解你的答案。你的想法很好,但我们面临两个问题。第一个问题是,在所有行的所有列中,我们都有一些数据,但我只是用我感兴趣的行/列来举例说明。因此,如果C2.index>j,则条件应该类似于
,然后继续。第二个问题是无法识别列的命名。我在完成df_to.Excel时使用了headers中的naming属性,但是因为我只得到了零而不是所需的名称,所以在定义每个df时必须使用“columns”属性。命名是相同的,但在尝试代码时仍然无法访问列。我得到以下错误
TypeError:(“强制使用Unicode:需要字符串或缓冲区,找到浮点值,'u'发生在索引15315上”)
。在我的例子中,dfs是通过导出某些列中的一些列表创建的。在每列的第15316行,列表结束,然后开始另一列。@dante我文章中的代码解决了您提出的问题。您不能期望答案考虑到您未声明的条件。在你的帖子中,你说“第3列有j个元素,第2列有k个元素,第2列从第“j+1”行开始,第3列从第1行开始”。这与“所有行上的所有列都有一些数据”不同。如果是这种情况,请编辑您的帖子,并明确说明问题。我已经更新了问题。先谢谢你。