[英]how to join excel column names with data frame headers in python?
我有一個示例數據框,例如:
adf = [['A', 'C', 'G'],['cat','dog','swine'],['black','ginger','pink']]`
pdf = pd.DataFrame.from_records(adf[1:], columns = adf[0])
Out[375]:
A C G
0 cat dog swine
1 black ginger pink
我需要將其保存到Excel工作表中,但是要考慮要寫入哪些Excel列。 即,我需要將pdf
列名與Excel中的列名連接起來,使其完全相同。
以下解決方案未保存在正確的列中,而是從左到右:
from openpyxl.utils.dataframe import dataframe_to_rows
workbook = openpyxl.load_workbook('map_df.xlsx')
ws = workbook.worksheets[0]
for r in dataframe_to_rows(pdf, index=False, header=False):
ws.append(r)
workbook.save("appended.xlsx")
注意,我加載了一個現有的工作簿。 我在第一行中有標頭,所以我寫的數據沒有頭。
我問的是通過標題相互映射列的方法,而無需手動編寫,刪除空白等,因為我有大量的數據。 這樣,貓就進入A
欄,豬就到達G
欄,並且B
或D
都不應填充。
例子:
我不是非常確定您的意思是您需要通過列名來映射列,而列名需要從文件中讀取,您需要創建一個適當列的字典來映射,然后在之后寫入值查找列號,或僅根據熊貓DataFrame的列名寫入值。
但無論哪種情況,您都不能使用append,而需要遍歷“ r”的每個值。
第一版(帶映射)
from openpyxl.utils.dataframe import dataframe_to_rows
workbook = openpyxl.load_workbook('map_df.xlsx')
ws = workbook.worksheets[0]
headers = worksheet.rows[1] # Assuming your header is in the first row
header_map = {
col: cell.column for cell in headers if cell.value.isin(pdf.columns)
}
start_row = 1
for r in dataframe_to_rows(pdf, index=False, header=False):
for i, (col_name, v) in enumerate(zip(pdf.columns, r)):
coln = header_map[col_name]
ws['{coln}{i}'.format(coln=coln, i=i + start_row)].value = v
第二版(直接從標題開始)
from openpyxl.utils.dataframe import dataframe_to_rows
workbook = openpyxl.load_workbook('map_df.xlsx')
ws = workbook.worksheets[0]
start_row = 1
for r in dataframe_to_rows(pdf, index=False, header=False):
for i, (col_name, v) in enumerate(zip(pdf.columns, r)):
ws['{coln}{i}'.format(coln=col_name, i=i + start_row)].value = v
我做了這樣的事情:
last_row = worksheet.max_row
for j in range(len(df.columns)):
for i in range(len(df)):
worksheet['%s%d' % (df.columns.values[j], last_row+1+i)] = df.iloc[i,j]
其中df
是我要在Excel中具有的所有列的pandas DataFrame結構。 因此它(例如,在df中)將A,C,G和B或D留空(根據Excel純列名,如果您具有從A到XEC的設置,或類似的東西)
我不是很滿意,因為它比一次保存整個工作表要慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.