我想比较具有不同数量元素的Excel文件中两个不同列的两个部分。应该在第3列的一部分和第2列的一部分之间进行比较。第3列部分具有j个元素的长度,第2列具有k个元素的长度(k> j)。第2列部分从行" j + 1"开始。第3列部分从第1行开始。如果第3列部分中的元素与第2列部分中的元素匹配,则应检查第j列之前的第1列中的元素是否与第3列中的匹配项具有相同的索引part与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
任何提示我如何才能做到这一点?
更新
我尝试了一个新代码,考虑到我们有' - ',就像joaquin在他的例子中提到的那样。
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
。知道什么是错的吗?
非常感谢, 丹
答案 0 :(得分:0)
鉴于你的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 和 C1 和 C2
df['C13'] = df.apply(lambda x: x['C1'] + x['C3'], axis=1)
df['C12'] = df.apply(lambda x: x['C1'] + x['C2'], axis=1)
并比较哪些行在 C13 和 C12 列中具有相同的字符对,并将其保存在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
注意这可能需要一些改进(p.e当一行产生2个匹配,第二行产生1匹配,并且你需要从最终输出中删除重复)。