[英]Populate Pandas Dataframe column from other columns based on a condition and previous row value
[英]Pandas, populate dataframe columns for each row from array in column
我有一個大型 Pandas Dataframe 具有以下結構:
data = {'id': [3, 5, 9, 12],
'names': ["{name1,name2,name3}", "{name1,name3}", "{name1,name2}", "{name2,name1,name3}"],
'values':["{N,Y,N}", "{N,N}", "{Y,N}", "{N,Y,Y}"]
}
df = pd.DataFrame(data)
df
請注意,名稱並不總是以相同的順序排列或總是包含在每個id
中,但是值的順序確實對應於為每行排序的名稱。
我想盡可能高效地將這張表轉換為以下結構:
data = {'id': [3, 5, 9, 12],
'name1': ["N", "N", "Y", "Y"],
'name2': ["Y", " ", "N", "N"],
'name3': ["N", "N", " ", "Y"],
}
df = pd.DataFrame(data)
df
目前我正在使用以下子例程完成此操作,其中我基本上是 go 通過df
逐行創建名稱和值的列表,然后將這些值添加到新列中。 這可以正常工作,但由於我的df
很大(~2e5 行),它非常慢(估計在 ~14 小時)。 並且每一行或id
最多可以有 194 個名稱,即"{name1, name2, ..., name193, name194}"
。
def add_name_cols(df, title_col, value_col):
nRows = len(df)
for index,row in df.iterrows(): # parse rows and replace characters
title_spl = [ i for i in row[title_col].replace('{','').replace('}','').split(',') ]
value_spl = [ i for i in row[value_col].replace('{','').replace('}','').split(',') ]
i = 0
for t in title_spl: # add value in correct column for this row
print('Progress rows: {0:2.2f}%, Progress columns: {1:2.2f}%'.format(float(index)/float(nRows)*100, float(i)/float(194)*100), end='\r')
df.loc[index,t] = value_spl[i]
i += 1
return df
df_new = add_name_cols(df, 'names', 'values')
df_new
有沒有辦法使用更多 Pandas 的內置方法來完成這種操作,從而加快這個過程?
在列表理解中使用字符串方法和 dict 構造函數。
(i) 將df[['names','values']]
轉換為列表列表
(ii) 遍歷每一對,即df
中的行,並使用str.strip
和str.split
創建一對列表,解包並轉換為dict
構造函數
(iii) 將得到的字典列表傳遞給pd.DataFrame
temp = pd.DataFrame([dict(zip(*[x.strip('{}').split(',') for x in pair])) for pair in df[['names','values']].to_numpy().tolist()]).fillna('')
df[temp.columns] = temp
df = df.drop(['names','values'], axis=1)
Output:
id name1 name2 name3
0 3 N Y N
1 5 N N
2 9 Y N
3 12 Y N Y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.