![](/img/trans.png)
[英]Adding a header/another row to a pandas dataframe based on some columns
[英]Adding a row above header columns in python pandas dataframe, without any file read/write
我需要在 dataframe 中的 header 列上方添加一行,將其轉換為 excel 文件,限制不能在本地進行任何文件讀取/寫入。 因此,我無法使用open('filename.xls', 'w') as f:
這是因為腳本將在本地無法讀取/寫入文件的地方運行。
例如,我想要這樣的東西
text here
*animal* *no_of_legs* *name*
cat 4 meow
bird 2 chirp
rabbit 2 bun
我有一個由所有動物數據組成的數組 allAnimals。 我嘗試allAnimals.insert(0,['text here])
然后df = pd.DataFrame(allAnimals, columns=['animals', 'no_of_legs', 'name'])
轉換為 dataframe。 然后我使用df.to_excel(xxx, index=False)
但我得到的是這樣的東西:
*animal* *no_of_legs* *name*
text here
cat 4 meow
bird 2 chirp
rabbit 2 bun
或者,我嘗試的另一種方法涉及創建一個新的 dataframe 僅存儲“此處的文本”,然后嘗試使用 concat 但它不會水平添加數據。 它改為添加一個新列。 append 也是如此。 所以這就是我得到的:
*animal* *no_of_legs* *name*
text here
cat 4 meow
bird 2 chirp
rabbit 2 bun
我已經閱讀了一些與此類似的其他問題,但它們不太適用於我的情況,因此,我無法解決這個問題。 任何提示將不勝感激!
添加行*在*列名稱的頂部 Pandas Dataframe 作為 header 信息?
您可以通過將其設為 MultiIndex 來編輯具有附加列索引級別的數據框列。 將 df.columns 指定為 pd.MultiIndex:
嘗試重現該示例:
import pandas as pd
allAnimals = [['cat', 4, 'meow'], ['bird', '2', 'chirp'], ['rabbit', 2 ,'bun']]
df = pd.DataFrame(allAnimals, columns= ['animals', 'no_of_legs', 'name'])
df.columns = pd.MultiIndex.from_tuples(
zip(['text here', '', ''],
df.columns))
df
Output:
如果需要,相應地刪除索引列。
這可能對您有幫助: 使用 pandas 附加列索引
上面的答案是回答問題的一大步,但是,它涉及多索引,然后不允許我在df.to_excel(xxx, index=False)
中使用 index=False 。 這導致 excel 文件格式不正確,因為它現在是 index=True。
老實說,這里唯一的復雜之處是無法在本地讀/寫的限制。
我繼續研究如何解決這個問題,並遇到了一些文章:
在輸出多個 header pandas dataframe 到 ZBF57C906FA7D25866D07372E 時去掉索引
我無法實現第一個網站的答案,因為我無法提供本地路徑。 我決定使用第二個網站的第一個解決方法,其中涉及使用 openpyxl 和使用 bytesIO。
如果將來有人需要這個,這里是實現:
from openpyxl import load_workbook, Workbook
in_memory_fp = io.BytesIO()
df.to_excel(in_memory_fp)
in_memory_fp.seek(0,0)
workbook = load_workbook(in_memory_fp)
worksheet = workbook['Sheet1']
worksheet.delete_cols(1)
worksheet.delete_rows(3)
for i in worksheet.values:
print(i)
workbook.save(in_memory_fp)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.