pandas 基于现有column-name和column-values在python数据框中创建列

smdncfj3  于 2023-02-02  发布在  Python
关注(0)|答案(3)|浏览(151)

我有一个Pandas的数据框:

import pandas as pd
# assign data of lists.  
data = {'Gender': ['M', 'F', 'M', 'F','M', 'F','M', 'F','M', 'F','M', 'F'], 
        'Employment': ['R','U', 'E','R','U', 'E','R','U', 'E','R','U', 'E'],
        'Age': ['Y','M', 'O','Y','M', 'O','Y','M', 'O','Y','M', 'O']
       } 
    
# Create DataFrame  
df = pd.DataFrame(data)  
df

我想要的是为每个现有列的每个类别创建一个新列,格式如下:

Gender_M -> for when the gender equals M
Gender_F -> for when the gender equal F
Employment_R -> for when employment equals R
Employment_U -> for when employment equals U
and so on...

到目前为止,我已经创建了下面的代码:

for i in range(len(df.columns)):
    curent_column=list(df.columns)[i]
    col_df_array = df[curent_column].unique()
    
    for j in range(col_df_array.size):
        new_col_name = str(list(df.columns)[i])+"_"+col_df_array[j]
    
        for index,row in df.iterrows():
            if(row[curent_column] == col_df_array[j]):
                df[new_col_name] = row[curent_column]

问题是,即使我成功地创建了列名,也无法获得正确的列值。
例如,“性别”列应如下所示:

data2 = {'Gender': ['M', 'F', 'M', 'F','M', 'F','M', 'F','M', 'F','M', 'F'],
         'Gender_M': ['M', 'na', 'M', 'na','M', 'na','M', 'na','M', 'na','M', 'na'], 
         'Gender_F': ['na', 'F', 'na', 'F','na', 'F','na', 'F','na', 'F','na', 'F']
       } 

df2 = pd.DataFrame(data2)

就是说,na可以是任何值,比如空白、点或NAN。

k4ymrczo

k4ymrczo1#

你要找的是pd.get_dummies

>>> pd.get_dummies(df)
    Gender_F  Gender_M  Employment_E  Employment_R  Employment_U  Age_M  Age_O  Age_Y
0          0         1             0             1             0      0      0      1
1          1         0             0             0             1      1      0      0
2          0         1             1             0             0      0      1      0
3          1         0             0             1             0      0      0      1
4          0         1             0             0             1      1      0      0
5          1         0             1             0             0      0      1      0
6          0         1             0             1             0      0      0      1
7          1         0             0             0             1      1      0      0
8          0         1             1             0             0      0      1      0
9          1         0             0             1             0      0      0      1
10         0         1             0             0             1      1      0      0
11         1         0             1             0             0      0      1      0
dldeef67

dldeef672#

如果您试图以类似df2示例的格式获取数据,我相信这就是您要寻找的。

ndf = pd.get_dummies(df)
df.join(ndf.mul(ndf.columns.str.split('_').str[-1]))

输出:
旧答案

df[['Gender']].join(pd.get_dummies(df[['Gender']]).mul(df['Gender'],axis=0).replace('',np.NaN))

输出:

Gender Gender_F Gender_M
0       M      NaN        M
1       F        F      NaN
2       M      NaN        M
3       F        F      NaN
4       M      NaN        M
5       F        F      NaN
6       M      NaN        M
7       F        F      NaN
8       M      NaN        M
9       F        F      NaN
10      M      NaN        M
11      F        F      NaN
ds97pgxw

ds97pgxw3#

如果您可以在新列中使用0和1,那么使用get_dummies(如@richardec所建议的)应该是最直接的。
但是,如果希望在每个新列中使用特定的字母,另一种方法是循环遍历当前列和每个列中的特定类别,然后使用apply根据这些信息创建一个新列。

for col in data.keys():
    categories = list(df[col].unique())
    for category in categories:
        df[f"{col}_{category}"] = df[col].apply(lambda x: category if x==category else float("nan"))

结果:

>>> df
   Gender Employment Age Gender_M Gender_F Employment_R Employment_U Employment_E Age_Y Age_M Age_O
0       M          R   Y        M      NaN            R          NaN          NaN     Y   NaN   NaN
1       F          U   M      NaN        F          NaN            U          NaN   NaN     M   NaN
2       M          E   O        M      NaN          NaN          NaN            E   NaN   NaN     O
3       F          R   Y      NaN        F            R          NaN          NaN     Y   NaN   NaN
4       M          U   M        M      NaN          NaN            U          NaN   NaN     M   NaN
5       F          E   O      NaN        F          NaN          NaN            E   NaN   NaN     O
6       M          R   Y        M      NaN            R          NaN          NaN     Y   NaN   NaN
7       F          U   M      NaN        F          NaN            U          NaN   NaN     M   NaN
8       M          E   O        M      NaN          NaN          NaN            E   NaN   NaN     O
9       F          R   Y      NaN        F            R          NaN          NaN     Y   NaN   NaN
10      M          U   M        M      NaN          NaN            U          NaN   NaN     M   NaN
11      F          E   O      NaN        F          NaN          NaN            E   NaN   NaN     O

相关问题