簡體   English   中英

Pandas,從列中的數組中為每一行填充 dataframe 列

[英]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.stripstr.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM