我正在處理一個在每一行中重復其標題名稱的 csv:
player: John Doe ; level: 45 ; last_login: 7854414174 ; coins: 7600
player: Anckx Uj ; level: 471 ; last_login: 7854418847 ; coins: 684111
我想知道如何在使用 pandas 匯入時只能選擇值,以便輸出如下所示:
Player level last_login coins
John Doe 45 7854414174 7600
Anckx Uj 471 7854418847 684111
我嘗試添加標題引數,因為我認為它會過濾掉行中的重復,但沒有成功。
import pandas as pd df = pd.read_csv('base.txt', sep=';', header=None, names=['player', 'level', 'last_login', 'coins']回傳與 csv 完全相同的東西(沒有分隔符)
*任何幫助,將不勝感激
uj5u.com熱心網友回復:
一種解決方案可能是在加載后清理行:
df = df.apply(lambda x: x.str.replace(r"^[^:] :", "").str.strip())
print(df)
印刷:
player level last_login coins
0 John Doe 45 7854414174 7600
1 Anckx Uj 471 7854418847 684111
并可能將level/coins列轉換為int:
df[["level", "coins"]] = df[["level", "coins"]].astype(int)
uj5u.com熱心網友回復:
一個命題使用pandas.DataFrame.pivot:
df= pd.read_csv("base.txt", header=None, names=["col"])
out = (
df["col"].str.extractall("(\w : \w \s?\w )")
.reset_index(drop=True)[0]
.str.split(":", expand=True)
.assign(idx= lambda x: x.groupby(0).cumcount())
.pivot(index="idx", columns=0)
.reset_index(drop=True)
)
out.columns = out.columns.get_level_values(1)
# 輸出 :
print(out)
0 coins last_login level player
0 7600 7854414174 45 John Doe
1 684111 7854418847 471 Anckx Uj
uj5u.com熱心網友回復:
這似乎是一個行迭代問題,我認為 csv 模塊使它易于理解和執行。
- 使用普通閱讀器閱讀輸入檔案,這將為我們提供每行的字串串列。
- 對于每一行:
- 創建空字典 new_row
- 迭代列并在冒號 (':') 上拆分以獲取標頭名稱及其值
- 使用名稱-值對構建 new_row
- 將 new_row 附加到串列 all_rows
- 使用 DictWriter 將 all_rows 轉換為最終的 CSV
下面是閱讀部分:
import csv
all_rows = []
with open("input.csv", newline="") as f:
reader = csv.reader(f, delimiter=";")
for row in reader:
new_row = {}
# row looks like, ['player: John Doe ', ' level: 45 ', ' last_login: 7854414174 ', ' coins: 7600']
for col in row:
name, val = col.split(":", 1)
new_row[name.strip()] = val.strip()
all_rows.append(new_row)
print(all_rows)
這給了我們:
[
{'player': 'John Doe', 'level': '45', 'last_login': '7854414174', 'coins': '7600'},
{'player': 'Anckx Uj', 'level': '471', 'last_login': '7854418847', 'coins': '684111'},
]
由此,我們可以使用 DictWriter,將第一行作為它應該查找和寫入的欄位名的示例:
with open("output.csv", "w", newline="") as f:
writer = csv.DictWriter(f, delimiter=";", fieldnames=all_rows[0])
writer.writeheader()
writer.writerows(all_rows)
這是 output.csv:
player;level;last_login;coins
John Doe;45;7854414174;7600
Anckx Uj;471;7854418847;684111
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534894.html
上一篇:在xslt樣式表中讀取CSV檔案
