【问题标题】:Create columns in python data frame based on existing column-name and column-values根据现有的列名和列值在 python 数据框中创建列
【发布时间】:2022-01-21 04:28:12
【问题描述】:

我在 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。

【问题讨论】:

标签: pandas dataframe iteration


【解决方案1】:

您正在寻找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

【讨论】:

    【解决方案2】:

    如果您尝试以像您的 df2 示例这样的格式获取数据,我相信这就是您正在寻找的。​​p>

    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
    

    【讨论】:

      【解决方案3】:

      如果您可以在新列中使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        • 2021-06-05
        • 1970-01-01
        • 2021-08-27
        • 2017-10-21
        • 2018-10-07
        • 2021-02-08
        相关资源
        最近更新 更多