![](/img/trans.png)
[英]Python, Pandas, dataframe - split and remove some parts of cell
[英]split each cell in dataframe (pandas/python)
我有一個大型的pandas數據幀,包含許多行和列,包含二進制數據,如'0 | 1','0 | 0','1 | 1','1 | 0',我想在2個數據幀中拆分,和/或擴展以便這個(兩者對我都有用):
a b c d
rowa 1|0 0|1 0|1 1|0
rowb 0|1 0|0 0|0 0|1
rowc 0|1 1|0 1|0 0|1
變
a b c d
rowa1 1 0 0 1
rowa2 0 1 1 0
rowb1 0 0 0 0
rowb2 1 0 0 1
rowc1 0 1 1 0
rowc2 1 0 0 1
和/或
df1: a b c d
rowa 1 0 0 1
rowb 0 0 0 0
rowc 0 1 1 0
df2: a b c d
rowa 0 1 1 0
rowb 1 0 0 1
rowc 1 0 0 1
目前我正在嘗試做類似以下的事情,但相信這不是很有效,任何指導都會有所幫助。
Atmp_dict=defaultdict(list)
Btmp_dict=defaultdict(list)
for index,row in df.iterrows():
for columnname in list(df.columns.values):
Atmp_dict[columnname].append(row[columnname].split('|')[0])
Btmp_dict[columnname].append(row[columnname].split('|')[1])
user2734178已關閉,但他或她的回答有一些問題。 這是一個有點微小的變化
import pandas as pd
df1 = pd.DataFrame()
df2 = pd.DataFrame()
# df is your original DataFrame
for col in df.columns:
df1[col] = df[col].apply(lambda x: x.split('|')[0])
df2[col] = df[col].apply(lambda x: x.split('|')[1])
這是另一個更優雅的選擇。 將循環替換為:
for col in df.columns:
df1[col] = df[col].str.extract("(\d)\|")
df2[col] = df[col].str.extract("\|(\d)")
這非常緊湊,但似乎應該有一種更簡單,更緊湊的方式。
df1 = df.applymap( lambda x: str(x)[0] )
df2 = df.applymap( lambda x: str(x)[2] )
或者像其他答案一樣循環遍歷列。 我認為這不重要。 請注意,因為問題指定了二進制數據,所以只需執行str[0]
和str[2]
而不是使用split
或extract
就可以(並且更簡單)。
或者你可以做到這一點,這看起來幾乎是愚蠢的,但它沒有任何實際的錯誤,它相當緊湊。
df1 = df.stack().str[0].unstack()
df2 = df.stack().str[2].unstack()
stack
只是將它轉換為一個系列,這樣你就可以使用str
然后unstack
將它轉換回數據幀。
由於看起來你的所有值都是字符串,你可以使用.str
訪問器將管道拆分為分隔符,例如,
import pandas as pd
df1 = pd.DataFrame()
df2 = pd.DataFrame()
#df is defined as in your first example
for col in df.columns:
df1[col] = df[col].str[0]
df2[col] = df[col].str[-1]
然后,您可能希望使用astype(int)
將df1
和df2
重鑄為int
列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.